2013-05-26 18 views
5

Ok ho già sfogliato molti argomenti qui ma nessuno di loro ha risolto il mio problema. Il mio problema è semplice: ho ultra semplice componente personalizzato:JSF 2 L'annotazione componente personalizzata non funziona

@FacesComponent("HelloWorldComponent") 
public class HelloWorldComponent extends UIComponentBase { 

public String getFamily() { 
return "my.custom.component"; 
} 

@Override 
public void encodeBegin(FacesContext ctx) throws IOException { 
String value = (String) getAttributes().get("value"); 

if (value != null) { 
ResponseWriter writer = ctx.getResponseWriter(); 
writer.write(value.toUpperCase()); 
} 
} 
} 

ma purtroppo ottengo l'errore:

JSF1068: Cannot instantiate component with component-type HelloWorldComponent 

mio taglib:

<?xml version="1.0" encoding="UTF-8"?> 
<facelet-taglib xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd" version="2.0"> 

<namespace>http://example.com/test</namespace> 
<tag> 
<tag-name>helloWorldComponent</tag-name> 
<component> 
<component-type>HelloWorldComponent</component-type> 
</component> 
</tag> 
</facelet-taglib> 

La cosa fondamentale è che se metto la mia componente personalizzato in faces-config tutto funziona perfettamente, ma come un greenhorn molto testardo in JSF sono convinto che ci sia modo di far funzionare le annotazioni senza registrare componenti personalizzati in faces-config. Mi aspetto di avere MOLTI componenti personalizzati, quindi voglio sapere come farli funzionare con annotazioni pure per non scrivere righe di codice di milioni in faces-config.

<?xml version="1.0" encoding="UTF-8"?> 
<faces-config xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd" version="2.0"> 

<application> 
<el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver> 
</application> 

<!-- <component> --> 
<!--   <component-type>HelloWorldComponent</component-type> --> 
<!--   <component-class>com.first.utils.view.components.HelloWorldComponent</component-class> --> 
<!--  </component> --> 

</faces-config> 

Quando annullo il tag del componente, tutto funziona. Ma letteralmente non voglio farlo, la sua non pigrizia costringe i computer a fare ciò che VOGLIO;).

La mia struttura del progetto: (im utilizzando primavera & Maven)

src 
~main 
~~java 
~~resources 
~~~META-INF 
~~~~faces-config.xml (duplicated as i read other topics) 
~~~~persistence.xml 
~~webapp 
~~~resources 
~~~~css 
~~~~utilComponent 
~~~WEB-INF 
~~~~templates 
~~~~faces-config.xml 
~~~~my.taglib.xml 
~~~~web.xml 
~~~*.html webpages.. 

Argomenti che ho già navigato: JSF custom component is not found
Cannot find annotated custom JSF2 component in jar
Custom Component using JSF

Sarebbe l'ideale se riprenderei hanno definire il mio taglib ma immagino sia impossibile? Ma per prima cosa voglio rendere le annotazioni funzionanti ... ogni aiuto apprezzato

+1

Non eseguo Maven, ma il file di classe componente deve essere in '/ WEB-INF/classes' o in un file JAR in'/WEB-INF/lib' (contenente '/ META-INF/faces- config.xml') per far funzionare '@ FacesComponent'. Doubleckeck il file WAR prodotto da Maven e modifica la configurazione di build, se necessario. – BalusC

+0

la mia classe componente (HelloWorldComponent) è in WEB-INF/classes insieme alle classi normali del mio progetto, e mi sono bloccato perché ho provato tutti i suggerimenti/soluzioni che ho trovato sul web – Zen

risposta

0

Hai provato a riavviare il server di applicazione? Non sono sicuro di come sia stato con Spring, ma ho risolto un problema simile per me in JBoss. È possibile che i componenti vengano registrati automaticamente all'avvio del server. Senza riavvio, devono essere elencati in qualche file.

Problemi correlati