我是DropWizard框架和Jersey的新手。所以我可以完全脱离我想要在这里完成的事情。
我遇到的问题是,我通过预匹配的请求过滤器添加到请求标头的参数未到达我的AuthCredentials对象的自定义提供程序。我试图为每个需要从头参数auth的资源提供一个AuthCredentials对象。由于我将依赖提供auth标头的服务之一还没有准备就绪,我将它们伪装成预先匹配的请求过滤器中的它们。
这是我的代码
@PreMatching
@Provider
class MyFilter implements ContainerRequestFilter{
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
requestContext.getHeaders().add("param1", "value1");
}
}
class MyAuthCredentialsFactory implements Factory<AuthCredentials>{
@Inject
public MyAuthCredentialsFactory(HttpServletRequest request){
System.out.println("Param1 header value = " + request.getHeader("param1")); // <---This prints null
}
}
我在drop wizard框架中的应用程序运行方法中注册这些类,如下所示。
@Override
public void run(ServerConfigType configuration,
Environment environment) {
environment.jersey().register(new AbstractBinder() {
@Override
protected void configure() {
bindFactory(MyAuthCredentialsFactory.class).to(AuthCredentials.class).in(RequestScoped.class);
}
});
environment.jersey().register(MyFilter.class);
我的资源使用此类身份验证凭据
@Path("/pathtomyresource")
public class MyApi {
@Inject AuthCredentials authCredentials;
}
我正在使用DropWizard 0.8.3和Jackson 2.5.3。
当我从头文件中打印param1的值时,我得到一个null。我查看了调试器中的HttpServletRequest的头名,并没有在那里找到param1,这解释了为什么值为null。我在互联网上做了很多研究,发现它应该可以工作但不适合我。在这一点上,我很困惑,我真的很感激任何帮助。
答案 0 :(得分:1)
HttpServletRequest
和ContainerRequestContext
不是一回事,在后者中设置某些东西不会导致它被放在前者中。您可以将ContainerRequestContext
注入Factory
,然后从那里获取属性
@Inject
public MyAuthCredentialsFactory(ContainerRequestContext request){
}
我个人所做的,当我需要访问请求上下文时,不是实现Factory
,而是像AbstractContainerRequestValueFactory
那样扩展here。然后,您只需拨打getContainerRequest()
即可获取ContainerRequest
(实际上是ContainerRequestContext
。
class MyAuthCredentialsFactory
extends AbstractContainerRequestValueFactory<AuthCredentials> {
@Override
public AuthCrendials provide() {
ContainerRequest request = getContainerRequest();
String header = request.getHeaderString(...);
}
}
或者,您可以使用ContainerRequestContext
在setProperty(key, value)
上设置任意属性,而不是设置标题,然后在工厂中使用getProperty(key)