如何将 @Inject 和 CDI 用于具有 JAX-RS 2.0 (Resteasy) 的企业 bean



我在查找如何让 JAX-RS 2.0 在野蝇 10 上与 CDI 一起工作时遇到了一些问题。我在另一篇文章中得到了一些答案,该帖子是 JAX-RS 1.0/2.0 的混合,他们使用了除 Wildfly 中包含的库之外的其他依赖项。

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

如何将 JAX-RS 2.0 与 Wildfly 10 中的包含 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 2.0 的 Resteasy 实现包含在 Wildlfy 10 中,因此无需添加进一步的依赖项。

接口不需要@Local何时驻留在同一个 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;
    }
}

最新更新