Почему JSF 2.0 RI (Mojarra) не сканирует аннотации моего класса? - PullRequest
13 голосов
/ 07 июня 2010

У меня есть проект War and Jar в моем проекте JSF на основе Eclipse.Я решил использовать аннотации, чтобы объявить мой FacesConverter (среди множества других вещей), а не объявлять его с помощью моего face-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, а также проект face-config.xml, в моем проекте Jar есть всеМои лица, связанные с Java-кодом (бины действий, управляемые бины, пользовательские конвертеры и т. д.)

Ответы [ 2 ]

29 голосов
/ 07 июня 2010

Да, я сразу отвечаю на свой собственный вопрос, потому что я уже неделю провел, стуча головой по столу, и я выяснил свою проблему только после отладки через JSF 2.0 RI (Mojarra), чтобы увидеть, что он делал.

По сути, сканер аннотаций просматривает только файлы WAR / / WEB-INF / classes .class для аннотаций (при условии, что у вас есть файл face-config.xml в / WEB-INF).Если вы храните свой код в отдельных файлах Jar и хотите, чтобы ваши файлы .class, содержащиеся в файлах / WEB-INF / lib .jar, сканировались на наличие аннотаций, , вы должны иметь файл face-config.xml в META-файле этого Jar-файла.Папка INF .Face-config.xml, который вы добавляете в банку, может быть пустым, он просто должен быть там, иначе сканер аннотаций будет пасовать вашу банку, как если бы он оставался мясным рулетом.

Пустой Face-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>

Я знаю, что там выбросили много -инфо.Итак, просто резюмируем.Ваш Face-config.xml в вашей войне идет в WEB-INF.Ваш потенциально пустой сканер аннотаций, включающий Face-config.xml в каждом из ваших файлов Jar, помещается в этот файл Jar META -INF.

Если вам интересно, почему поведение должно бытьЭто так круто, потому что конфиги JSF могут быть децентрализованы и распределены между библиотеками 1 и 3 сторонних производителей.И если вы задаетесь вопросом о существенном факте лица-config.xml в банке, мое мнение таково, что именно это делает банку интересной для движка - и отсутствие конфигурации лица.xml означает, что сканер аннотаций может избежать этого и сэкономить на обработке во время развертывания .Было бы неплохо, если бы эта семантика сканера была где-то более понятна,!

Следующее сообщение в блоге было очень полезно в моем понимании того, что делает код:

http://one -size-doesnt-fit-all.blogspot.com / 2007/01 / using-множественные лица-configxml-files-in.html

Я действительно надеюсь, что это избавит кого-то от такой мучительной недели, как я.

4 голосов
/ 30 июня 2011

JAR содержит EJB и FacesBeans:

В случае, если JAR, содержащий Faces Beans, уже связан в ухо (потому что он содержит EJB), тогда вам также нужно поместить тот же JAR в WEB-INF / lib войны (поверх добавления лица-config.xml в каталоге META-INF), чтобы контейнер распознавал аннотации JSF 2.0.

В этом случае, вероятно, лучше создать два JARS, один для EJB и один для FacesBeans.

...