Wie man Eclipse autocomplete Arbeit mit JSF composite-Bauteilen in GLAS?

Hintergrund /Problem

Ich versuche, erstellen Sie eine wiederverwendbare JSF composite component, die geteilt werden können zwischen vielen Anwendungen durch Verpackung der Komponenten in jars (ähnlich Bereitstellen von JSF composite-Komponenten für die gemeinsame Nutzung und JSF 2.0 composite-Komponente in Glas).

Wenn Sie versuchen zu finden, die diese Komponenten in einer facelets-Seite von einem web-Projekt in Eclipse, ist es nicht von AutoVervollständigen (content-assist), die tags oder Attribute von meiner composite component.

Unter Verwendung der gleichen composite-Komponente jar in NetBeans funktioniert (autocompletion funktioniert!).

Kurze Zusammenfassung

  • Eclipse (eigentlich Rational Software Architect 8.0.4.1 - basierend auf Eclipse Helios)

  • Web-Projekt mit Dynamischen web-Modul und JSF Facetten aktiviert

  • Composite-Komponente jar über den build-path

  • Composite-Bauteil-namespace deklariert facelets-Seite (interessanterweise funktioniert die AutoVervollständigen-namespace, string meiner Komponente)

  • Nur die standard-JSF-tags autocomplete (h:, f:, ui:, etc), sowie Primefaces (p:)

  • Keine Autovervollständigung für meine composite-Komponente 🙁

  • Autocompletion funktioniert wenn ich verschieben Sie die Komponente an einem web-Projekt und verbrauchen Sie es von dort aus (aber dann ist es nicht mehr wiederverwendbar in anderen Projekten!)

Die details

Composite-Komponente jar-Struktur

Meine zusammengesetzte Komponente jar hat die folgende Struktur, wenn Sie kompiliert (ich bin tatsächlich mit Maven, so dass die source-Struktur ist ein wenig anders).

composite-component.jar
|- META-INF/
|   |- beans.xml          (empty - just the beans tag)
|   |- faces-config.xml   (empty - just the faces-config tag/attributes)
|   \- resources
|       \- example
|           \- country.xhtml
\- com
     \- example
           |- Country.java
           |- CountryController.java  (the CDI managed bean)

Composite-Bauteil-definition

Land.xhtml hat den folgenden Inhalt

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:cc="http://java.sun.com/jsf/composite"
    xmlns:c="http://java.sun.com/jsp/jstl/core">

<!-- INTERFACE -->
<cc:interface>
    <cc:attribute name="value"
        shortDescription="A value expression for the selected value."
        required="true" />
</cc:interface>

<!-- IMPLEMENTATION -->
<cc:implementation>

    <p:autoComplete value="#{cc.attrs.value}"
        completeMethod="#{countryController.complete}" var="country"
        itemLabel="#{country.name}" itemValue="#{country.code}" dropdown="true"
        forceSelection="true">
    </p:autoComplete>

</cc:implementation>
</html>

Managed bean

Meine CDI managed bean hat folgenden Inhalt

package example;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.enterprise.context.ApplicationScoped;
import javax.inject.Named;

@ApplicationScoped
@Named
public class CountryController {

    private static final List<Country> COUNTRIES = Arrays.asList(
        new Country("AUS", "Australia"), 
        new Country("FRA", "France"), 
        new Country("USA", "United States of America"));

    public List<Country> complete(String query) {
        List<Country> suggestions = new ArrayList<Country>();
        for (Country c : COUNTRIES) {
            if (c.getName().toLowerCase().contains(query.toLowerCase())) {
                suggestions.add(c);
            }
        }
        return suggestions;
    }
}

Verzehr der composite-Komponente

Ist, wenn ich ein JSF-Projekt in NetBeans und meine composite-Komponenten (Primefaces), um den build path, add den richtigen namespace zu meinem facelets-Seite (xmlns:x="http://java.sun.com/jsf/composite/example") es funktioniert einfach.

Bekomme ich die Autovervollständigung auf meine Komponente, die Attribute, und es verwendet sogar die Dokumentation von meiner Komponente definition.

Wenn ich die gleiche zusammengesetzte Komponente jar in den build-path von meinem Eclipse-Projekt web (JSF facet aktiviert), ich bekomme nichts. Es autocompletes für standard-JSF-tags und für Primefaces, aber nicht für meine Komponente.

Habe ich bemerkt, dass Primefaces verwendet eine taglib-Datei - ist das, was erforderlich ist für mein Szenario? Ich würde es hassen zu müssen, duplizieren Sie die Informationen, um die Autovervollständigung zu arbeiten.

Edit:

Als tasel vorgeschlagen hat, die beste Lösung (bisher) ist zu installieren JBoss Tools (insbesondere die RichFaces-plugin). Dies ermöglicht eine Autovervollständigung für composite-Bauteile verpackt in jar-Dateien (einschließlich dem einfügen alle obligatorischen Attribute für Sie und autocompleting alle anderen Attribute mit dem schweben Dokumentation).

Ich würde auch empfehlen die Installation der JBoss Tools CDI-plugin, wenn Sie mit CDI, wie dieses gibt Ihnen die Autovervollständigung für CDI managed beans und deren Eigenschaften/Methoden.

Den Eclipse-update-site-URLs sind:

Helios:

http://download.jboss.org/jbosstools/updates/stable/helios/

Indigo:

http://download.jboss.org/jbosstools/updates/stable/indigo/

Ich habe Probleme bei der Installation von der update-site-URL und landete Download der p2-repo aus der update-Seite und installieren Sie es lokal, aber abgesehen davon, dass ich bin sehr glücklich über die Autovervollständigung funktioniert in Eclipse!

InformationsquelleAutor James Bassett | 2012-07-19

Schreibe einen Kommentar