2016-04-15 22 views
0

私のRESTfulサービスの1つにEJB 3.1を注入しようとしています。私はポストに従った:Inject an EJB into JAX-RS (RESTful service)と注射プロバイダを構築する以外のすべてのオプションを試してみました。私が試している現在の解決策は@RequestScoped@Injectの組み合わせを使用しますが、注入されたbean変数はまだnullです。 /WEB-INFフォルダにbeans.xmlがあります。エンタープライズBeanをJAX-RS 2.0 RESTサービスに挿入するとNullPointerExceptionが発生する

EJBをRESTサービスクラスに挿入するにはどうすればよいですか?

UserServiceの

@Local 
@Path("user/v1") 
@Produces(MediaType.APPLICATION_JSON) 
public class UserServiceV1 implements SystemLogger { 

    @Inject 
    private ApplicationBean appBean; 

    @GET 
    @Path("pingbean") 
    @Produces(MediaType.APPLICATION_JSON) 
    public Response pingAppBean() { 
     if(appBean == null) { 
      return Response.status(Response.Status.UNAUTHORIZED).entity("{\"faild\": \"App bean is null\"}").build(); 
     } 
     String message = appBean.getHello(); 
     return Response.status(Response.Status.OK) 
       .entity(message) 
       .build(); 
    } 
} 

ApplicationBean SystemHandlerは、JARモジュールに常駐し、ビジネス・ロジックを有する標準的なクラスです。

@Stateless 
@Local 
public class ApplicationBean implements ApplicationBeanLocal { 

    @Override 
    public String getHello() { 
     return "Hello from ApplicationBean"; 
    }; 
} 

JAX-RS構成

@ApplicationPath("service") 
public class ApplicationService extends Application { 

    @Override 
    public Set<Class<?>> getClasses() { 
     Set<Class<?>> resources = new HashSet<>(); 
     resources.add(UserServiceV1.class); 
     resources.add(ApplicationBean.class); 
     resources.add(CorsFilterProvider.class); 
     return resources; 
    } 
} 

例外

14:07:01,230 ERROR [io.undertow.request] UT005023: Exception handling request to /MyApp/service/user/v1/login: org.jboss.resteasy.spi.UnhandledException: java.lang.NullPointerException 
     at org.jboss.resteasy.core.ExceptionHandler.handleApplicationException(ExceptionHandler.java:76) [resteasy-jaxrs-3.0.14.Final.jar:3.0.14.Final] 
     at org.jboss.resteasy.core.ExceptionHandler.handleException(ExceptionHandler.java:212) [resteasy-jaxrs-3.0.14.Final.jar:3.0.14.Final] 

RESTEasyに/ JAX-RS 私はthe documentation

<dependency> 
    <groupId>org.jboss.resteasy</groupId> 
    <artifactId>resteasy-jaxrs</artifactId> 
    <version>3.0.14.Final</version> 
    <scope>provided</scope> 
</dependency> 
<dependency> 
     <groupId>org.jboss.resteasy</groupId> 
     <artifactId>resteasy-cdi</artifactId> 
     <version>3.0.14.Final</version> 
     <scope>provided</scope> 
</dependency> 
に応じてRESTEasyのためのCDIの実装を追加しました

EDIT:質問とタイトルに変更されたコードの詳細

答えて

0

EJB 3.1は、Java EE 6コンテナの実装を意味します。 Java EE 6は、JAX-RS 1.1を意味します。

JAX-RS 1.1はエンタープライズJava Beanの@EJBインジェクションをサポートするためにのみ必要です。

Java EE 7実装で提供されているJAX-RS 2.0は、EJB用の@Injectをサポートしています。

0

Steve Cが答えたように、JAX-RS 1.1にEJBを挿入する適切な方法は、javax.ejb.EJBアノテーションです。これが動作するには、RESTサービスもEJBでなければなりません。そのため、javax.enterprise.context.RequestScopedの代わりにjavax.ejb.Statelessアノテーションを使用する必要があります。次のように

最終的な結果は次のとおりです。

@Stateless 
@Path("user/v1") 
public class UserServiceV1 implements SystemLogger { 
    @EJB 
    private ApplicationBean appBean; 

    //etc. 
} 

EDIT

更新されたコードは展開しません。 ApplicationBeanApplicationBeanLocalを実装してインタフェースを挿入するか、インタフェースを実装してクラスを直接注入しないでください。それを修正して、私はあなたの例をうまく走らせました。

また、ApplicationServiceには、ApplicationBean.classを追加する必要はありません。そこには、RESTルートリソースとフィーチャプロバイダのみを登録します。 クラスでも@Localは不要ですが、EJBではありません。

さらにbeans.xmlではなく、bean.xmlではありません(ただし、このファイルはCDI 1.1以降では必要ありません)。

を参照してください以下の私のtestcode:JARモジュール用

pom.xml依存関係:

<dependencies> 
    <dependency> 
     <groupId>javax.ejb</groupId> 
     <artifactId>javax.ejb-api</artifactId> 
     <version>3.2</version> 
    </dependency> 
</dependencies> 

ApplicationBeanLocal.java

public interface ApplicationBeanLocal { 
    String getHello(); 
} 

ApplicationBean.java

@Stateless 
@Local 
public class ApplicationBean implements ApplicationBeanLocal { 
    @Override 
    public String getHello() { 
     return "Hello from ApplicationBean"; 
    } 
} 

pom.xml JAX-RSアプリケーションの依存関係:

<dependencies> 
    <dependency> 
     <groupId>org.jboss.resteasy</groupId> 
     <artifactId>resteasy-jaxrs</artifactId> 
     <version>3.0.14.Final</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.jboss.resteasy</groupId> 
     <artifactId>resteasy-cdi</artifactId> 
     <version>3.0.14.Final</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>javax.enterprise</groupId> 
     <artifactId>cdi-api</artifactId> 
     <version>1.2</version> 
     <scope>provided</scope> 
    </dependency> 

    <!-- The jar-module containing ApplicationBean and ApplicationBeanLocal --> 
    <dependency> 
     <groupId>test</groupId> 
     <artifactId>testjar</artifactId> 
     <version>0.0.1-SNAPSHOT</version> 
    </dependency> 
</dependencies> 

TestApplication.java

@ApplicationPath("service") 
public class TestApplication extends Application { 

    private final Set<Class<?>> resources = new HashSet<>(); 

    public TestApplication() { 
     resources.add(UserServiceV1.class); 
    } 

    @Override 
    public Set<Class<?>> getClasses() { 
     return resources; 
    } 
} 

UserServiceV1.java

@Path("user/v1") 
@RequestScoped 
@Produces(MediaType.APPLICATION_JSON) 
public class UserServiceV1 { 

    @Inject // Note that I'm referencing the interface, not the implementation 
    private ApplicationBeanLocal appBean; 

    @GET 
    @Path("pingbean") 
    @Produces(MediaType.APPLICATION_JSON) 
    public Response pingAppBean() { 
     final String message = appBean.getHello(); 
     return Response.status(Response.Status.OK).entity(message).build(); 
    } 
} 
+0

私は私がやった他のプロジェクト内のBeanを注入する@EJBを使用JAX-RS 1.1。しかし、私の現在のプロジェクトでは、JAX-RS 2.0を使用しています。resteasy-jaxrsの依存関係を参照してください。明日の問題を解決しようとするだろう、どんな入力も歓迎される。 – Chris

+0

使用しているアプリケーションサーバーとバージョンは何ですか?あなたがRestEasyを宣言し、Jerseyを依存関係として宣言していないので、私はJBoss EAPまたはWildflyを想定しています。 – RafaelHamasaki

+0

JBossで提供されているRestEasyバージョン(旧バージョンのJAX-RS 1.1準拠バージョンでも可)を使用しない場合は、モジュールをデプロイメントから除外する必要があります。 参照: [リンク](https://access.redhat.com/documentation/en-US/JBoss_Enterprise_Application_Platform/6/html/Development_Guide/Exclude_a_Subsystem_from_a_Deployment.html) [リンク](HTTPS://docs.jboss .org/author/display/WFLY8/Class + Loading + in + WildFly) – RafaelHamasaki

関連する問題