1

JBoss と J2EE は初めてです。セッション Bean を使用してシングルトン Bean に接続しようとしています。長期的には、Singleton Bean にいくつかの情報をキャッシュし、それが利用できない場合は、データベースで関連情報を検索したいと考えています。しかし、最初に、可能な限り単純なユース ケースを作成します。

しかし、Eclipse でこの単純なユース ケース (アプリケーション カウンターを取得する) を実行すると、EJB への null 参照が取得され、次にどこを参照すればよいかわかりません。

Eclipse Keplar、JDK1.7、JBoss AS 7.1、EJB 3.1 を実行しています

ここにjspファイルがあります。

<?xml version="1.0" encoding="ISO-8859-1" ?>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<jsp:useBean id="counter" class="com.bender.counter.Counter" scope="session"/>
<%-- <jsp:useBean id="counterBean" class="com.bender.counterbean.CounterBean" scope="application"/> --%>

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Test Counter</title>
</head>

<body>
Hit Counter( <%=counter.getHitCount() %> )<br/>
<%-- Hit CounterBean( <%=counterBean.getHits() %> )<br/> --%>
</body>
</html>

これが最初のセッション Bean です

package com.bender.counter;

import com.bender.counterbean.CounterBean;
import javax.ejb.EJB;
import javax.enterprise.context.SessionScoped;

@SessionScoped
public class Counter {
    @EJB 
    CounterBean counterBean;

    private int hitCount;

    public Counter() {
        this.hitCount = 0;
    }

    public int getHitCount() {
        if (counterBean == null) {
            System.out.println("Failure");
            hitCount = -1;
        } else {
            hitCount = counterBean.getHits();
        }
        return hitCount;
    }

    public void setHitCount(int newHits) {
        this.hitCount = newHits;
    }
}

これがシングルトンBeanです

package com.bender.counterbean;

import javax.annotation.PostConstruct;
import javax.ejb.Singleton;
import javax.ejb.Startup;

@Startup
@Singleton
public class CounterBean {
    private int hits = 1;

    public CounterBean() {
        super();
        System.out.println("In constructor of CounterBean.");
    }

    @PostConstruct
    public void init(){
        System.out.format("In post Construct of CounterBean, hits( %d )%n", this.hits);
    }

    // Increment and return the number of hits
    public int getHits() {
        return hits++;
    }
}

server.log からの出力は次のとおりです。counterbean が jndi に登録されているように見えることに注意してください。jsp でコメントアウトされている点にも注意してください。これは、jsp から CounterBean に接続しようとする試みでした。その試みは成功したので、CounterBean はサーバーで正常に実行されていると思います。

17:07:50,427 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-12) JBAS015876: Starting deployment of "Counter.war"
17:07:50,443 INFO  [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (MSC service thread 1-15) JNDI bindings for session bean named CounterBean in deployment unit deployment "Counter.war" are as follows:

    java:global/Counter/CounterBean!com.bender.counterbean.CounterBean
    java:app/Counter/CounterBean!com.bender.counterbean.CounterBean
    java:module/CounterBean!com.bender.counterbean.CounterBean
    java:global/Counter/CounterBean
    java:app/Counter/CounterBean
    java:module/CounterBean

17:07:50,458 INFO  [stdout] (MSC service thread 1-8) In constructor of CounterBean.

17:07:50,458 INFO  [stdout] (MSC service thread 1-8) In post Construct of CounterBean, hits( 1 )

17:07:50,474 INFO  [org.jboss.web] (MSC service thread 1-4) JBAS018210: Registering web context: /Counter
17:07:50,489 INFO  [org.jboss.as.server] (management-handler-threads - 83) JBAS018559: Deployed "Counter.war"
17:07:55,185 INFO  [stdout] (http-localhost-127.0.0.1-8080-1) Failure

ご協力いただきありがとうございます!

4

2 に答える 2

1

インジェクションは、DI コンテナー (JBoss ではウェルド) がオブジェクトを認識している場合にのみ機能します。これは通常、コンテナー自体がインスタンスを作成するために発生します。既存のオブジェクトをコンテナに渡して、すべての依存関係を注入することもできます。

JSP ページへの CDI インジェクションが JBoss AS 7 で機能しないようです。

おそらく、JSP に代わるものを見てみましょう。

別のテクノロジーに切り替えることができない場合は、自分で注入を行う必要がある場合があります。次のメソッドを使用して、CDI コンテナが特定のオブジェクトのすべてのインジェクションを実行できるようにします。

public static <T> void programmaticInjection(Class<T> clazz, T injectionObject) throws NamingException {
    InitialContext initialContext = new InitialContext();
    Object lookup = initialContext.lookup("java:comp/BeanManager");
    BeanManager beanManager = (BeanManager) lookup;
    AnnotatedType<T> annotatedType = beanManager.createAnnotatedType(clazz);
    InjectionTarget<T> injectionTarget = beanManager.createInjectionTarget(annotatedType);
    CreationalContext<T> creationalContext = beanManager.createCreationalContext(null);
    injectionTarget.inject(injectionObject, creationalContext);
    creationalContext.release();
}

次に、JSP からこのメソッドを呼び出します。

<h3>Inject Test</h3>
          <%
                    MyBean myBean = new MyBean();
                    myBean.programmaticInjection(MyBean.class, myBean);
                    // now call a method on myBean that invokes the injected EJB
          %>
</body>
</html>

MyBeanここにあなたのものに似た単純なJSF Beanがあります:

@Named("myBean")
@SessionScoped
public class MyBean implements Serializable {
    private static final Logger logger = LoggerFactory.getLogger(MyBean.class);
    private static final long serialVersionUID = 1L;
    private long taskId;
    @EJB
    private MyEjb myEjb;

programmaticInjection()@EJB アノテーション付きオブジェクトを呼び出した後、注入されます。

于 2013-10-11T13:25:09.143 に答える
0

JNDI ルックアップを追加することで、この問題を解決できました。JBoss AS 7.1 インスタンス内で何かが正しくセットアップされていないため、1 つの Bean が (デフォルトの) JNDI を使用できる一方で、JSP ページには (完全な) JNDI アクセス権があります。これが更新された(そしてクリーンアップされた)コードです。

JSP

<?xml version="1.0" encoding="ISO-8859-1" ?>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<jsp:useBean id="counter" class="com.bender.counter.Counter" scope="session"/>

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Test Counter</title>
</head>

<body>
Hit Counter( <%=counter.getHitCount() %> )<br/>
</body>
</html>

セッション Bean (@EJB がコメント化されていることに注意してください) package com.bender.counter;

import com.bender.counterbean.CounterBean;

import javax.ejb.EJB;
import javax.enterprise.context.SessionScoped;
import javax.naming.InitialContext;
import javax.naming.NamingException;

@SessionScoped
public class Counter {
//    @EJB
    private CounterBean counterBean;
    {
        try {
            counterBean = (CounterBean) new InitialContext().lookup("java:global/Counter/CounterBean");
        } catch (NamingException e) { 
            e.printStackTrace();
        }
    }

    private int hitCount;

    public Counter() {
        this.hitCount = 0;
    }

    public int getHitCount() {
        if (counterBean == null) {
            System.out.println("Failure");
            hitCount = -1;
        } else {
            hitCount = counterBean.getHits();
        }
        return hitCount;
    }

    public void setHitCount(int newHits) {
        this.hitCount = newHits;
    }
}

そしてシングルトンビーン

package com.bender.counterbean;

import javax.annotation.PostConstruct;
import javax.ejb.Singleton;
import javax.ejb.Startup;


@Startup
@Singleton
public class CounterBean {
    private int hits = 1;

    public CounterBean() {
        super();
        System.out.println("In constructor of CounterBean.");
    }

    @PostConstruct
    public void init(){
        System.out.format("In post Construct of CounterBean, hits( %d )%n", this.hits);
    }

    // Increment and return the number of hits
    public int getHits() {
        return hits++;
    }
}

そして、これがJBossコンソール出力です

16:21:55,740 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-12) JBAS015876: Starting deployment of "Counter.war"
16:21:55,888 INFO  [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (MSC service thread 1-1) JNDI bindings for session bean named CounterBean in deployment unit deployment "Counter.war" are as follows:

    java:global/Counter/CounterBean!com.bender.counterbean.CounterBean
    java:app/Counter/CounterBean!com.bender.counterbean.CounterBean
    java:module/CounterBean!com.bender.counterbean.CounterBean
    java:global/Counter/CounterBean
    java:app/Counter/CounterBean
    java:module/CounterBean

16:21:56,033 INFO  [stdout] (MSC service thread 1-7) In constructor of CounterBean.

16:21:56,033 INFO  [stdout] (MSC service thread 1-7) In post Construct of CounterBean, hits( 1 )

16:21:56,088 INFO  [org.jboss.web] (MSC service thread 1-15) JBAS018210: Registering web context: /Counter
16:21:56,093 INFO  [org.jboss.as] (MSC service thread 1-15) JBAS015874: JBoss AS 7.1.0.Final "Thunder" started in 2001ms - Started 185 of 258 services (72 services are passive or on-demand)
16:21:56,176 INFO  [org.jboss.as.server] (DeploymentScanner-threads - 2) JBAS018559: Deployed "Counter.war"
16:22:11,455 INFO  [stdout] (http-localhost-127.0.0.1-8080-1) In constructor of CounterBean.
于 2013-10-15T21:23:01.210 に答える