Почему JSF 2.0 RI (Mojarra) не просматривает аннотации моего класса?
У меня есть проект War and Jar в моем проекте JSF на основе Eclipse. Я решил использовать аннотации, чтобы объявить мой FacesConverter (среди множества других вещей), а не объявлять его с помощью моих faces-config.xml.
@FacesConverter(value="passwordFieldStringConverter")
public class PasswordFieldStringConverter implements Converter {
public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) throws ConverterException {
try {
return arg2.getBytes("UTF-16BE");
}
catch(UnsupportedEncodingException uee) {
Assert.impossibleException(uee);
}
return(null);
}
public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) throws ConverterException {
try {
return new String((byte[]) arg2, "UTF-16BE");
}
catch(UnsupportedEncodingException uee) {
Assert.impossibleException(uee);
}
return(null);
}
}
И затем я использую passwordFieldStringConverter непосредственно в моем .xhtml:
<?xml version="1.0" encoding="UTF-8" ?>
<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:ui="http://java.sun.com/jsf/facelets"
xmlns:sec="http://www.springframework.org/security/facelets/tags">
<ui:composition>
<f:view>
<f:loadBundle basename="landingPage.bundle" var="bundle" />
<ui:decorate template="/WEB-INF/jsf_helpers/htmlShell.xhtml">
<ui:param name="PageTitleParam" value="#{bundle.pageTitle}" />
<h:form>
<h:dataTable var="rowVar" value="#{userListContainer.users}">
<f:facet name="header"><h:outputText value="Users you are currently managing:" /></f:facet>
<h:column>
<f:facet name="header">
<h:outputText value="Screen Name" />
</f:facet>
<h:outputText value="#{rowVar.screenName}" />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Password" />
</f:facet>
<h:outputText value="#{rowVar.password}">
<f:converter converterId="passwordFieldStringConverter" />
</h:outputText>
</h:column>
</h:dataTable>
</h:form>
</ui:decorate>
</f:view>
</ui:composition>
</html>
Предполагается, что JSF сканирует банки в моей войне во время развертывания и обнаруживает, какие классы имеют аннотации на них (и автоматически настраивают приложение соответственно). Моя проблема заключается в том, что JSF, по-видимому, не обнаруживает классы, у которых есть спортивные аннотации.
В проекте War есть все мои .xhtml файлы, а также проект faces-config.xml, в моем проекте Jar есть все связанные с моим лицом Java-код (действие beans, управляемый beans, пользовательские преобразователи и т.д..)
Ответы
Ответ 1
Да, я сразу отвечаю на свой вопрос, потому что я уже провел неделю, ударяя головой по столу, и только разобрался с моей проблемой после отладки через JSF 2.0 RI (Mojarra), чтобы увидеть, что он делает.
В основном, сканер аннотаций обращается только к файлам WAR/WEB-INF/classes.class для аннотаций (при условии, что у вас есть face-config.xml in/WEB-INF). Если вы сохраняете свой код в отдельных файлах Jar и хотите, чтобы ваши файлы .class, которые были в файле /WEB -INF/lib.jar, были отсканированы для аннотаций, у вас должен быть файл faces-config.xml в этом JAR META- INF папка. Лица-config.xml, которые вы вбрасываете в свою банку, могут быть пустыми, это просто должно быть там, или же сканер аннотаций будет передавать вашу банку, как будто это остался мясной рулет.
Пустое лицо-config.xml:
<?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 /WEB-INF/schema/web-facesconfig_2_0.xsd"
version="2.0" metadata-complete="false">
<!-- This file must be present with our jar, even if it is empty. Otherwise, our Java annotations won't get scanned! -->
</faces-config>
Я знаю, что там вышло много -INF. Итак, просто напомню. Ваши лица-config.xml в вашей войне входят в WEB-INF. Ваш потенциально пустой, включенный скрипт аннотации, faces-config.xml в каждом из ваших файлов Jar находится в этом банке META -INF.
Если вам интересно, почему поведение должно быть настолько сумасшедшим, это потому, что конфигурации JSF могут быть децентрализованы и разбросаны по 1-й и 3-й партийным библиотекам таким образом. И если вы задаетесь вопросом о том, что все грани-config.xml присутствуют в банке в качестве фактора, то, по моему мнению, это то, что отмечает Jar как интересный для двигателя - и отсутствие face-config.xml означает, что сканер аннотаций может избежать этой банки и сохранять при обработке во время развертывания. Было бы неплохо, если бы эта семантика сканера была немного разъяснена где-то, < исключение удалено > !
Следующее сообщение в блоге было очень полезно в моем понимании того, что делал код:
http://one-size-doesnt-fit-all.blogspot.com/2007/01/using-multiple-faces-configxml-files-in.html
Я действительно надеюсь, что это спасет кого-то из недели боли, как у меня.
Ответ 2
JAR содержит как EJB, так и FacesBeans:
В случае, если JAR, содержащий Faces Beans, уже связан в ухе (потому что он содержит EJB), тогда вы также должны поместить тот же JAR в WEB-INF/lib войны (вместо добавления faces-config.xml в каталог META-INF), так что контейнер распознает аннотации JSF 2.0.
В этом случае, вероятно, лучше создать два JARS, один для EJB и один для FacesBeans.