У меня есть война и проект Банки в моем основанном на Eclipse проекте JSF. Я решил использовать аннотации, чтобы объявить мой 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, по-видимому, не обнаруживает классы, которые я имею который спортивные аннотации.
Военный проект имеет все мои .xhtml файлы, а также faces-config.xml проекта, мой проект Банки имеет весь мой связанный с поверхностями код Java (бобы действия, управляемые компоненты, пользовательские преобразователи, и т.д.)
Да, я немедленно отвечаю на свой вопрос, потому что я уже неделю бился головой об стол и понял свою проблему только после отладки через JSF 2.0 RI (Mojarra), чтобы посмотреть, что он делает.
Обычно сканер аннотаций обращается только к файлам WAR / WEB-INF / classes .class для аннотаций (при условии, что у вас есть faces-config.xml в / WEB-INF). Если вы храните свой код в отдельных файлах Jar и хотите, чтобы ваши файлы .class, которые есть в файлах / WEB-INF / lib .jar, сканировались на предмет аннотаций, у вас должен быть файл faces-config.xml в META- Папка INF . Файл faces-config.xml, который вы помещаете в свою банку, может быть пустым, он просто должен быть там, иначе сканер аннотаций пройдет мимо вашей банки, как будто это был остаток мясного рулета.
Пустой файл faces-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. Итак, просто резюмируем. Ваш faces-config.xml в вашем War идет в WEB-INF. Ваш потенциально пустой, включающий сканер аннотаций, faces-config.xml в каждом из ваших Jar-файлов входит в этот Jar-файл META -INF.
Если вам интересно, почему поведение должно быть таким безумным, то это потому, что таким образом конфигурации JSF могут быть децентрализованы и разбросаны по 1-м и сторонним библиотекам. И если вам интересно, что все присутствие faces-config.xml в банке является одним из факторов, я считаю, что именно это отмечает Jar как интересный для движка - и отсутствие faces-config .xml означает, что сканер аннотаций может избежать этого jar и сэкономить на обработке во время развертывания .Было бы хорошо, если бы эта семантика сканера была где-то более четко объяснена, <ругательства удалены>!
Следующее сообщение в блоге очень помогло мне понять, что делает код:
http://one-size-doesnt-fit-all.blogspot.com/2007/01/using-multiple-faces -configxml-files-in.html
Я очень надеюсь, что это избавит кого-нибудь от недели мучений, как я.