4

RestEasy で実装された jax-rs サービスがあり、Jboss as7 を使用しており、@Signleton アノテーションを使用して signleton ejb を実装しています。サーバーの起動時 (@startup) に signleton が開始され、@EJB を使用して jax-rs に挿入したいと考えています。問題は、クラスが常に null であり、私が見たすべてのチュートリアルで ejb を注入する方法であるため、迷子になり始めていることです。特別な xml ファイルを使用する必要がありますか? 私は何を間違っていますか?

@Path("/")
public class Service extends Application{
@EJB
private GlobalStore store;
public Service(){
fromejbstore = store.getSentiment();//null pointer is thrown
}
}

Signleton ejb は次のとおりです。

@Singleton
@Startup
public class GlobalStore {
 Sentiment sentiment;
 @PostConstruct
public void initialize() {
 //do something
}
public Sentiment getSentiment(){return sentiment;}
}
4

6 に答える 6

3

知る限り、@EJB アノテーション インジェクションは POJO では機能しません。(クラス レベルで @Stateless アノテーションを追加することにより) Service クラスをステートレス セッション Bean に変えてみてください。GlobalStore インジェクションは魅力的に機能するはずです。

于 2012-08-06T11:58:30.303 に答える
3

コードを次のように変更し、インジェクションを回避しました。

    `try{
        InitialContext ctx=new InitialContext();
        localRef = (myEjb) ctx.lookup("java:global/appName/EjbName");
       }catch(NamingException ne){
            System.out.println("\n[MyRestService]NamingException: "+ne);
            ne.printStackTrace();
       }`

@EJB アノテーションが機能しない理由が見つかりませんでした。おそらくこれは RestEasy に関係しています。

于 2012-04-29T13:58:14.820 に答える
1

Rest サービスから EJB を呼び出すときにも同じ問題が発生しました。@EJB を注入すると null が発生しました。サービス クラスに @Stateless を追加しようとすると、問題はありません。Service クラスに @Stateless を追加できると思います。それなら問題ないでしょう。

于 2013-09-12T11:18:49.420 に答える
0

JAX-RS を間違った方法でアクティブ化していると思います。拡張Applicationされ、アノテーションが付けられたクラス@ApplicationPathは、JAX-RS をアクティブ化するための Java EE 6 の「非 XML」アプローチです。

@ApplicationPath("/rest")
public class JaxRsActivator extends Application {
 /* class body intentionally left blank */
}

次に、次Serviceのように同じパッケージに含める必要がありますがJaxRsActivator、拡張する必要はありませんApplication:

@Path("/test")
public class Service
{
  @EJB private GlobalStore store;

  @GET @Path("/test")
  public String getTime()
  {
   boolean test = (store==null);
   return "Test: "+test;
  }
}

ブラウザでテストできますhttp://<host>/<context>/rest/test/test

于 2012-04-27T05:41:34.317 に答える
-2

beans.xml を web-inf に追加します。

<?xml version="1.0" encoding="UTF-8"?>
<beans 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 
      http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
</beans>

クラスを変更して、アプリケーションを拡張します。

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

import java.util.HashSet;
import java.util.Set;

@ApplicationPath("/rest")

public class YourApplication extends Application
{
   HashSet<Object> singletons = new HashSet<Object>();

   public YourApplication()
   {
      getClasses().add(yourOwnClass.class);
   }

   @Override
   public Set<Class<?>> getClasses()
   {
      HashSet<Class<?>> set = new HashSet<Class<?>>();
      return set;
   }

    enter code here

   @Override
   public Set<Object> getSingletons()
   {
      return singletons;  
   }
}
于 2013-09-03T15:12:02.933 に答える