【问题标题】:How to use @Inject and CDI for enterprise beans with JAX-RS 2.0 (Resteasy)如何通过 JAX-RS 2.0 (Resteasy) 为企业 bean 使用 @Inject 和 CDI
【发布时间】:2016-09-16 02:53:34
【问题描述】:

我在寻找如何让 JAX-RS 2.0 与 Wildfly 10 上的 CDI 一起工作时遇到一些问题。我在另一个 post 上得到了一些答案,它是 JAX-RS 1.0/2.0 的混合体,他们使用了其他依赖项而不是Wildfly 中包含的库。

我的目标是将一个封装了驻留在同一个 jar 中的业务逻辑的单例企业 bean 注入到我的 REST 资源中。 REST 资源类应该是请求范围的,并且只处理 REST 功能(请求和响应)。我的 POJO 类是用 JAXB 表示的。

如何在 Wildfly 10 中将 JAX-RS 2.0 与包含 CDI 库一起使用?

bean 接口

@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;
    }
}

REST 资源

@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();
    }        
}

【问题讨论】:

  • 我不明白这个问题的重点。 JAX-RS 开箱即用地支持 CDI。
  • 我也不明白你的意思。要在 Java EE 7 容器中启用 JAX-RS 资源,您只需使用 JAX-RS 注释(取决于您的 Maven 依赖项中示例的 Java EE 规范),然后注入您想要注入的任何内容(会话 bean、托管豆,...) 使用 CDI。也无需依赖 Resteasy 库(除非您使用 Resteasy 特定功能)
  • 是的,不需要为 JAX-RS 2.0 添加依赖项。编辑了答案。

标签: rest jax-rs cdi wildfly resteasy


【解决方案1】:

JAX-RS 2.0 的 Resteasy 实现已包含在 Wildlfy 10 中,因此无需添加更多依赖项。

接口不需要@Localwhen 驻留在同一个 jar/war 中以便 CDI 找到它。要使 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 的实现。

@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;
    ...

如果您扩展 jax-rs 应用程序类,则无需配置 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;
    }
}

【讨论】:

    猜你喜欢
    • 2013-12-07
    • 2014-12-20
    • 1970-01-01
    • 2013-11-21
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 2016-07-23
    • 2012-11-03
    相关资源
    最近更新 更多