Почему 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.