我有一些问题,找出如何让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();
}
}
答案 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;
}
}