Почему не делает JSF 2.0 RI сканирование (Mojarra) аннотации моего класса?

У меня есть война и проект Банки в моем основанном на 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 (бобы действия, управляемые компоненты, пользовательские преобразователи, и т.д.)

13
задан Jørgen R 13 February 2015 в 11:27
поделиться

1 ответ

Да, я немедленно отвечаю на свой вопрос, потому что я уже неделю бился головой об стол и понял свою проблему только после отладки через 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

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

29
ответ дан 1 December 2019 в 19:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: