我刚刚使用Jersey启动了我的第一个Java REST项目。
在这个项目中,我将实现Pure Dependency Injection架构模式(又名穷人的依赖注入)。
如果我理解正确,将为每个传入的HTTP请求创建此类的新实例:
@Path("/v1")
public class ApiControllerV1 {
@POST
@Path("/measurements")
public String newMeasurement() {
// some code here
}
}
我可以"领带"组合根的生命周期到ApiControllerV1
的生命周期,但是我失去了在不同请求之间共享对象的能力。
因此,我需要找到一些"全球"我可以" tie"组成根。这"全球"对象应该可以从ApiControllerV1
访问。我确定这样的物体存在,但直到现在我都找不到它。请指出我正确的方向(将非常感谢代码片段。)
答案 0 :(得分:2)
您可以注册控制器的实例。这样你就可以通过构造函数传递任何你想要的东西。每个请求实例化只是默认值,如果您按类注册或允许Jersey打包扫描您的控制器。但这不是强制性的
public class AppConfig extends ResourceConfig {
public AppConfig() {
final Whatever whatever = new Whatever();
register(new Controller1(whatever));
register(new Controller2(whatever));
}
}
如果您使用web.xml进行配置,则可以配置要使用的AppConfig
<servlet>
<servlet-name>Jersey</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.example.AppConfig</param-value>
</init-param>
</servlet>
以前,您可能有类似
的内容<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.your.packages</param-value>
</init-param>
允许Jersey扫描您的资源并为您注册。你可以摆脱这个,因为现在我们在AppConfig
。
您需要使用Jersey配置其他任何内容,您可以在AppConfig
内进行操作。请参阅API for ResourceConfig
顺便说一下,你应该考虑使用Jersey提供的DI系统。这很容易使用。