10505


以下を参考にJSF2.2のアプリを作成しています。  
<http://d.hatena.ne.jp/shin/20091001/p5>

環境  
・Eclipse Keplar  
・JDK 1.7.0_21  
・JSF 2.2  
・GlassFish 4.0

以下のTestBean.javaとindex.xhtmlを作成しました。

index.xhtmlにアクセスした時に@PostConstructが付いているinit()が起動し、変数myNameに値が入ること・logが出力されることを期待していますが、init()が起動していないようです。  
原因を教えてください。

TestBean.java

[code]

    import java.io.Serializable;
    import javax.annotation.PostConstruct;
    import javax.faces.bean.SessionScoped;
    import javax.inject.Named;
    
    @Named
    @SessionScoped
    public class TestBean implements Serializable{
    
        private String myName = "testName";
    
        /**
         * デバッグ用
         */
        StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
    
    
        /**
         * コンストラクタが呼ばれインスタンスが生成されたあとに呼ばれる
         */
        @PostConstruct
        private void init(){
            this.myName = "test";
            for (StackTraceElement stackTraceElement : stackTraceElements) {
                 System.out.println("-----------------------------");
                 System.out.println("ClassName  : " + stackTraceElement.getClassName());
                 System.out.println("FileName   : " + stackTraceElement.getFileName());
                 System.out.println("MethodName : " + stackTraceElement.getMethodName());
                 System.out.println("LineNumber : " + stackTraceElement.getLineNumber());
                 System.out.println("-----------------------------");
            }
    
        }
    
    
        public String getMyName() {
            return myName;
        }
    
    
        public void setMyName(String myName) {
            this.myName = myName;
        }
    
    }
    
[/code]

index.xhtml

[code]

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml"
          xmlns:ui="http://java.sun.com/jsf/facelets"
          xmlns:h="http://java.sun.com/jsf/html"
          xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>Hello, world.</title>
    </h:head>
    <h:body>
    
        <h:outputText id="myname" value="ようこそ、#{testBean.myName}さん"/>
        <h:form>
            名前を入力してください。
            <h:inputText id="myname" value="#{testBean.myName}"/>
            <h:commandButton type="submit" value="実行"/>
        </h:form>
    
    </h:body>
    </html>
    
[/code]


CC BY-SA 3.0
2015-05-21T15:34:35.017
10473
2015-06-22T01:33:35.253
2015-05-23T00:57:50.133
9577
9577
question
java java8 xhtml jsf
JavaEE JSF2.2 @PostConstructが効かない


CDIとJSFのアノテーションは混合してはならない。この解釈で正しいかはわかりませんが。

[code]

    import javax.faces.bean.SessionScoped;
    import javax.inject.Named;
    @Named
    @SessionScoped
    
[/code]

上記の場合、CDIアノテーションの@NamedとJSFアノテーションの@SessionScopedが混合している。

CDIアノテーションの@SessionScopedを使用するように以下のように変更した。

[code]

    import javax.faces.bean.SessionScoped;
    →import javax.enterprise.context.SessionScoped;
    
[/code]


CC BY-SA 3.0
2015-05-22T11:37:09.573
10505
2015-05-22T11:37:09.573
9577
10473
answer