我的问题是:为什么在创建部署在某种servlet容器(如jetty或tomcat)上的应用程序时执行JavaSE应用程序和ServletModule时需要创建AbstractModule?它们之间有什么区别?
我需要将Jersey与Guice集成在一起。是否需要注册Guice的存在才能以某种方式使用它?我是否可以仅启用注入并在我想要的任何地方(常规类,过滤器,处理程序,服务,DAO等)进行注入?为什么我不能像JavaSE应用程序那样仅配置guice,而是需要使用ServletModule?
据我在网上看到的,Guice有很多使用HK2服务的示例,反之亦然,所以我认为它很重要吗?(必要?)
谢谢
An AbstractModule
是Guice引导(配置)阶段的基本构建块。您始终需要其中一个或多个。另一方面,a
ServletModule
是一种特殊化,它鉴于您正在servlet容器中运行而为您做一些配置。
从Guice文档中:
该模块设置了请求和会话作用域,并提供了一个从中配置过滤器和servlet的地方。
关于Guice-Jersey集成,您当然需要进行设置。它不会突然出现。Guice和任何其他依赖项注入框架一样,在 可以控制构建对象的情况下
起作用。如有疑问,请问自己是谁创建的对象。
使用Jersey和一般的JAX-RS,谁来创建对象?不是您,您只需定义它们即可。容器创建它们。JAX-
RS运行时。在您的情况下,Jersey运行时。并且Jersey在内部使用HK2依赖项注入框架。因此,您需要 桥接
这两个框架,以便注入使用一些Guice资源定义的JAX-
RS类。或反过来!这就是为什么要有HK2滑鼠桥的原因。因此,Jersey将使用HK2来构建您的对象,而HK2也会通过该桥在Guice上查找您的资源。
一个简单的例子。我使用此代码初始化要在其中注入Guice资源的REST API。
@ApplicationPath("api")
public class ApiRest extends ResourceConfig {
private static final Logger log = LoggerFactory.getLogger(ApiRest.class);
@Inject
public ApiRest(ServiceLocator serviceLocator, ServletContext servletContext) {
log.debug("Inicialitzant Jersey.");
packages("net.sargue.app.api");
GuiceBridge.getGuiceBridge().initializeGuiceBridge(serviceLocator);
GuiceIntoHK2Bridge guiceBridge = serviceLocator.getService(GuiceIntoHK2Bridge.class);
Injector injector = (Injector) servletContext.getAttribute(Injector.class.getName());
if (injector == null)
throw new RuntimeException("Guice Injector not found");
guiceBridge.bridgeGuiceInjector(injector);
}
}
请注意,上面的示例需要ServletModule
注册,因为它从中拉出Guice注射器ServletContext
。或者,您可以仅将注射器添加ServletContext
到其他位置。或仅在初始化REST
API时创建注入器,这取决于您的首选项和应用程序。
我目前使用的是球衣 我现在要做的是设置泽西,这样当查询参数进来时(比如缩进),我可以告诉Jackson以“更漂亮的格式,也就是缩进”序列化JSON。您可以通过使用SerializationConfig.Feature.INDENT_OUTPUT配置JSON映射器来轻松地告诉Jackson这样做。 问题是,我如何在每个请求的基础上获取一个queryparam并使用它来修改Jackson的输出?
问题内容: 我有一个Jersey REST API,并且正在使用来处理授权。我还在所有端点上使用,以便我的API可以处理数千个并发请求。 我的授权过滤器命中了一个远程服务,但是当运行过滤器时,Jersey尚未将当前线程添加到它的内部,因此我完全失去了异步的好处。 我可以告诉Jersey我希望这是异步的吗? 这是一个示例资源: 更新 刚刚收到泽西队球员的回音,从2.7开始,这是不可能的。只有资源方法
我很难理解泽西岛的注入机制。JAX-RS规范(http://jsr311.java.net/nonav/releases/1.1/spec/spec3.html#x3-520005)指出,在应用程序子类、根资源类和提供程序中可以通过@Context进行注入。 我现在有一个在启动时实例化的类,并且有一个在每次请求时调用的方法。在方法内部,我需要访问当前的UriInfo对象。问题是,这个方法不是从我的
我正在泽西岛2中编写一个RESTful网络服务。我想支持响应的 Gzip 编码。按照这个答案,我在我的类中启用了。 在我的资源类中,我返回一个对象。 现在,当我点击这个api时,我得到一个响应,但响应头不包含头,而是包含 header。 请求: 响应: 响应中没有 标头,也没有任何标头。 我在上使用。 我还遗漏了其他配置吗?我如何获得这两个头并得到gzip压缩的响应,而不是接收分块的响应? 编辑:
问题内容: 我在Glassfish上有一个工作正常的JavaEE 6 Web应用程序,该应用程序已经具有JSF前端并具有其身份验证机制((使用基于CDI和注释的安全性),因此有一个登录屏幕,用户输入用户名密码,按登录按钮和Java EE身份验证过程开始。 现在,我想“还将”我的一些服务类公开为REST服务(我可能会使用Jersey),因此也可以从移动设备访问它。但是让我担心的是登录部分。 我将使用
我有一个问题,让昂首阔步的博士一代工作。 以下是我使用的专家: 我在ResourceConfig类中添加了swagger ressources: 然后我声明了一个 servlet 来配置 Swagger: 通过上面的配置,可以使用swagger servlet:如果我浏览到api文档url,我会得到以下信息: 但是,如果我使用如下所示的真实配置更改 swagger servlet 配置中的 api