2016-05-19 3 views
0

JAX-RS 2.0をwildfly 10でCDIで使用するには、いくつか問題があります。別のpost JAX-RS 1.0/2.0が混在しており、Wildflyのライブラリとは別の依存関係を使用していました。JAX-RS 2.0(Resteasy)でエンタープライズBeanに@InjectとCDIを使用する方法

私の目的は、同じJAR内にあるビジネスロジックをカプセル化したシングルトンエンタープライズBeanをRESTリソースに注入することです。 RESTリソースクラスはリクエストスコープでREST機能(リクエストとレスポンス)のみを扱うものとします。私のPOJOクラスはJAXBで表記されています。

Wildfly 10のインクルードCDIライブラリでJAX-RS 2.0を使用するにはどうすればよいですか?

ビーンインタフェース

@Local 
public interface DateBean { 
    Date getLocalFormatDate(); 
} 

ビーン

@Singleton 
public class DateBeanImpl implements DateBeanLocal { 

    private static final Logger LOG = Logger.getLogger("org.test.logger"); 

    public DateBean() { 
     LOG.fine("DateBean"); 
    } 

    @Override 
    public Date getLocalFormatDate() { 
     Calendar cal = Calendar.getInstance(); 
     TimeZone localZone = TimeZone.getDefault(); 
     cal.setTimeZone(localZone); 
     Date localTime = cal.getTime(); 
     return localTime; 
    } 
} 

@Path("classroom") 
@Consumes({MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN}) 
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) 
public class ClassRoomResource { 

    private static final Logger LOG = Logger.getLogger("org.clearbyte.logger"); 
    @Inject private DateBean dateBean; 

    public ClassRoomResource() { 
     LOG.fine("ClassRoomResource"); 
    } 

    @GET 
    @Path("{id}/getDummy") 
    public ClassRoom getDummy(@PathParam("id") long id) { 
     ClassRoom room = new ClassRoom(); 
     room.setRoomName("Dummy"); 
     room.setRoomNr(id); 
     return room; 
    } 

    @GET 
    @Path("localDate") 
    @Produces({MediaType.TEXT_HTML}) 
    public Response getLocalformatDate() { 
     LOG.fine("DateBean variable: " +dateBean); 
     Date localDate = dateBean.getLocalDate(); 
     LOG.fine("Local date: " +localDate); 
     return Response.status(Response.Status.OK) 
       .entity(localDate.toString()) 
       .build(); 
    }   
} 
+0

私はこの質問のポイントを取得しません。 JAX-RSは、CDIをそのまま使用できます。 –

+0

私もあなたの意見を得ることはありません。 Java EE 7コンテナでJAX-RSリソースを有効にするには、JAX-RSアノテーション(必要に応じてJava EE仕様に依存する)を使用し、注入するものを注入するだけです(セッションBean、管理対象豆、...)を使用しています。 Resteasyライブラリにも依存する必要はありません(Resteasy固有の機能を使用する場合を除く) –

+0

本当に、JAX-RS 2.0の依存関係を追加する必要はありません。答えを編集しました。 – Chris

答えて

0

JAX-RS 2.0のRESTEasyの実装がWildlfy 10に含まれているRESTリソース、そうありますさらに依存関係を追加する必要はありません。

CDIが同じjar/warに存在する場合、このインターフェイスには@Localは必要ありません。 CDIのエンタープライズBeanシングルトンに@ApplicationScopeを使用するには、読み込み/書き込み同期を持つマネージドBeanを必要としない場合は、@ Singleton表記を省略できます。

@ApplicationScoped 
public class DateBeanImpl implements DateBean { 

    private static final Logger LOG = Logger.getLogger("org.test.logger"); 

    public DateBean() { 
     LOG.fine("DateBean"); 
    } 

    @Override 
    public Date getLocalFormatDate() { 
     //DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); 
     Calendar cal = Calendar.getInstance(); 
     TimeZone localZone = TimeZone.getDefault(); 
     cal.setTimeZone(localZone); 
     Date localTime = cal.getTime(); 
     return localTime; 
    } 
} 

範囲指定されたRESTリソース要求が@RequestScoped表記を使用するようにします。 @InjectがBeanの実装ではなくインタフェースを注入することに注意してください。あなたはJAX-RSアプリケーションのクラスを拡張する場合

@RequestScoped 
@Path("classroom") 
@Consumes({MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN}) 
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) 
public class ClassRoomResource { 

    private static final Logger LOG = Logger.getLogger("org.clearbyte.logger"); 
    @Inject private DateBean dateBean; 
    ... 

web.xmlのない構成が必要です。

@ApplicationPath("rest") 
public class ClassRoomApp extends Application { 

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

    public ClassRoomApp() { 
     resources.add(ClassRoomResource.class); 
    } 

    @Override 
    public Set<Class<?>> getClasses() { 
     return resources; 
    } 
} 
関連する問題