13

Eclipse ベースの JSF プロジェクトに War と Jar プロジェクトがあります。Faces-config.xml を使用して宣言するのではなく、アノテーションを使用して FacesConverter を宣言することにしました (無数にあるものの中で)。

@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);  
 }

}

そして、.xhtml で直接passwordFieldStringConverterを使用します。

<?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 は、展開時に私の戦争で jar をスキャンし、どのクラスに注釈が付けられているかを検出します (それに応じてアプリケーションを自動構成します)。私の問題は、JSF が、私が持っているどのクラスの注釈を付けているかを明らかに検出していないことです。

War プロジェクトにはすべての .xhtml ファイルとプロジェクトの faces-config.xml があり、Jar プロジェクトにはすべての顔関連の Java コード (アクション Bean、マネージド Bean、カスタム コンバータなど) があります。

4

2 に答える 2

30

はい、私はすぐに自分の質問に答えています。なぜなら、私はすでに 1 週​​間テーブルに頭をぶつけており、JSF 2.0 RI (Mojarra) を介してデバッグして、それが何をしているかを確認した後に問題を理解したからです。

基本的に、アノテーション スキャナーは、WAR の /WEB-INF/classes .class ファイルのみを参照してアノテーションを取得します (/WEB-INF に faces-config.xml があると仮定します)。コードを個別の Jar ファイルに保持し、/WEB-INF/lib .jar ファイルにある .class ファイルを注釈用にスキャンする場合は、その Jar の META-INF フォルダーに faces-config.xml が必要です。jar に追加する faces-config.xml は空でもかまいません。そこにある必要があります。そうしないと、アノテーション スキャナーが jar をミートローフの残り物のように通過させてしまいます。

空の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はWEB-INFに入ります。各 Jar ファイル内の空である可能性がある注釈スキャナー有効化の faces-config.xml は、その Jar のMETA -INF に入ります。

なぜこのような振る舞いをする必要があるのか​​ 疑問に思っている場合は、JSF 構成がこのように分散化され、1st および 3rd パーティのライブラリに分散されている可能性があるためです。そして、jar 内の 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

これが私のような一週間の痛みから誰かを救うことを本当に願っています.

于 2010-06-07T05:46:47.947 に答える
5

JAR には EJB と FacesBeans の両方が含まれます。

Faces Bean を含む JAR がすでに ear にバンドルされている場合 (EJB が含まれているため)、同じ JAR を war の WEB-INF/lib に配置する必要があります(faces-コンテナーが JSF 2.0 アノテーションを認識するようにします。

この場合、EJB 用と FacesBean 用に 1 つずつ、合計 2 つの JARS を作成することをお勧めします。

于 2011-06-30T15:41:26.210 に答える