2016-07-20 9 views
0

これは私が持っているコードです:@PostConstructがJetty + Apache MyFacesの実装で動作しないのはなぜですか?

のpom.xml

<dependency> 
    <groupId>javax.faces</groupId> 
    <artifactId>javax.faces-api</artifactId> 
    <version>2.2</version> 
</dependency> 
<dependency> 
    <groupId>com.sun.faces</groupId> 
    <artifactId>jsf-impl</artifactId> 
    <version>2.2.13</version> 
</dependency> 
<build> 
    <finalName>darbe</finalName> 
    <plugins> 
     <plugin> 
      <groupId>org.eclipse.jetty</groupId> 
      <artifactId>jetty-maven-plugin</artifactId> 
      <version>9.2.1.v20140609</version> 
      <configuration> 
       <scanIntervalSeconds>2</scanIntervalSeconds> 
       <webApp> 
        <contextPath>/</contextPath> 
       </webApp> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

web.xmlの

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
          http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 
     version="3.1"> 

    <servlet> 
     <servlet-name>FacesServlet</servlet-name> 
     <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>FacesServlet</servlet-name> 
     <url-pattern>*.xhtml</url-pattern> 
    </servlet-mapping> 

    <welcome-file-list> 
     <welcome-file>foo.xhtml</welcome-file> 
    </welcome-file-list> 

</web-app> 

foo.xhtml

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://xmlns.jcp.org/jsf/html"> 
<h:head> 
    <title>Foo</title> 
</h:head> 
<h:body> 
    <h:outputText value="#{foo.bar}"/> 
</h:body> 
</html> 

、最終的にはFoo.java

package biz.tugay; 

import javax.annotation.PostConstruct; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.SessionScoped; 

@ManagedBean 
@SessionScoped 
public class Foo { 

    private String bar; 

    @PostConstruct 
    public void init() { 
     bar = "Hello World"; 
    } 

    public String getBar() { 
     return bar; 
    } 

    public void setBar(String bar) { 
     this.bar = bar; 
    } 
} 

ここでは、OracleのJSF実装を使用しています。このプロジェクトをビルドしてTomcatにデプロイするかJettyプラグイン(mvn jetty:start)を使用すると、Hello Worldという文字列がブラウザに表示されます。私は依存関係を変更したとき

しかし、下図のように:私はMavenを使ってWARファイルを作成し、Tomcatにそれを展開する場合、私は唯一のHello Worldのが表示されます

<dependency> 
    <groupId>org.apache.myfaces.core</groupId> 
    <artifactId>myfaces-api</artifactId> 
    <version>2.2.10</version> 
</dependency> 
<dependency> 
    <groupId>org.apache.myfaces.core</groupId> 
    <artifactId>myfaces-impl</artifactId> 
    <version>2.2.10</version> 
</dependency> 

。 mvn jetty:startを使ってアプリケーションを実行すると@PostConstructは決して呼び出されないので、foo.barはnullになります。

ここでは何が起こっていますか? JSF実装に基づいて処理されるjavax.annotationパッケージの注釈はどのように処理されるか、処理されないのですか?コンテナはWARファイルを実行しますか?

答えて

1

答えは、Tomcatを使って@ PostConstruct/@ PreDestroyの組み込みサポートを備えたmyfacesがすぐに出荷され、デフォルトで有効になっているということです。

プラグイン桟橋の達人で実行しているとき、あなたのログのトレースを見ればあなたが表示されます:

2016年7月21日午前9時49分42秒AMをorg.apache.myfaces.config.annotation.DefaultLifecycleProviderFactory getLifecycleProvider INFO:LifecycleProvider org.apache.myfaces.config.annotation.Tomcat7AnnotationLifecycleProvider

を使用するので、MyFacesのは、Tomcat LifeCycleProviderはそのIMPLジャーに焼いたことが判明し、デフォルトでそれを使用しています。

解決策は、myfaceに明示的に別のLifeCycleProviderを使用するように指示することです。私はorg.apache.myfaces.config.annotation.NoInjectionAnnotationLifecycleProviderを(impl jar内で)使用しましたが、動作するようですが、詳細についてはmyfacesリストを尋ねる価値があります。 LifeCycleProviderを設定するには、これをweb.xmlに追加します。

  <context-param> 
      <param-name> 
       org.apache.myfaces.config.annotation.LifecycleProvider 
      </param-name> 
      <param-value> 
       org.apache.myfaces.config.annotation.NoInjectionAnnotationLifecycleProvider 
      </param-value> 
      </context-param> 
関連する問題