我在查找如何让 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;
}
}