2013-05-26 13 views
5

Ok, przeglądałem już wiele tematów tutaj, ale żaden z nich nie rozwiązał mojego problemu. Mój problem jest prosty: Mam ultra prosty niestandardowy komponent:Adnotacja komponentów JSF 2 nie działa

@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()); 
} 
} 
} 

ale niestety otrzymuję błąd:

JSF1068: Cannot instantiate component with component-type HelloWorldComponent 

mój 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> 

Kluczową rzeczą jest, jeśli położę niestandardowy komponent w face-config wszystko działa idealnie, ale jako bardzo uparty żółtodziób w JSF jestem przekonany, że musi istnieć sposób, aby adnotacje działały bez rejestracji niestandardowych komponentów w face-config. Oczekuję, że będę miał DUŻO niestandardowych komponentów, więc chcę wiedzieć, jak sprawić, by działały z czystymi adnotacjami, aby nie zapisywać milionów linii kodu w face-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> 

Po odkomentowaniu znacznika elementu wszystko działa. Ale dosłownie nie chcesz tego robić, to nie jest lenistwo zmuszanie komputerów do robienia tego, co CHCĘ;).

Moja struktura projektu (im przy sprężynę & 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.. 

tematy Ja już przejrzysz: JSF custom component is not found
Cannot find annotated custom JSF2 component in jar
Custom Component using JSF

Byłoby idealnie, gdyby nie pojadę mieć zdefiniować mój taglib, ale myślę, że to niemożliwe? Ale pierwszą rzeczą, najpierw chcę, aby adnotacje pracy ... Każda pomoc mile widziane

+1

nie robię Maven, ale plik klasy komponent musi być w '/ WEB-INF/classes' lub w pliku JAR w'/WEB-INF/lib' (zawierający '/ META-INF/faces- config.xml'), aby '@ FacesComponent' działał. Kliknij dwukrotnie plik WAR wygenerowany przez Maven i zmień konfigurację kompilacji, jeśli to konieczne. – BalusC

+0

Moja klasa komponentów (HelloWorldComponent) jest w WEB-INF/klasach wraz ze zwykłymi klasami z mojego projektu i utknąłem, ponieważ wypróbowałem wszystkie wskazówki/rozwiązania, które mogłem znaleźć w sieci – Zen

Odpowiedz

0

Czy próbowałeś restartu serwera aplikacji? Nie jestem pewien, jak to jest w przypadku Spring, ale rozwiązałem podobny problem dla mnie w JBoss. Możliwe, że komponenty są rejestrowane automatycznie po uruchomieniu serwera. Bez restartu muszą być wymienione w jakimś pliku.