如何使用JAX-RS 2.0(Resteasy)将{Inject和CDI用于企业bean

时间:2016-05-19 09:48:57

标签: rest jax-rs cdi wildfly resteasy

我有一些问题,找出如何让JAX-RS 2.0与wildfly 10上的CDI一起使用。我得到了另一个post的答案,它是JAX-RS 1.0 / 2.0的混合物,他们使用其他依赖项比Wildfly中包含的库。

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

如何在Wildfly 10中使用包含CDI库的JAX-RS 2.0?

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

1 个答案:

答案 0 :(得分:0)

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

当同一个jar / war驻留在CDI中时,界面不需要@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的实现。

@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 Application类,则无需配置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;
    }
}