我有一个基于令牌的用户身份验证的Jersey REST应用程序。当请求传入时,会创建一个自定义的RestContext
对象,并将其作为一个属性添加到ContainerRequestContext中(通过在收到请求后立即运行的过滤器)。此上下文管理用户授权(通过角色)和对其他业务逻辑的访问。在资源中可以使用它来执行业务逻辑。处理请求时,
RestContext
将在第二个过滤器中清除,该过滤器在管道的最末端执行。
虽然它需要两个过滤器,但它工作得很好。我一直在阅读HK2和< code>InjectionResolver
的用法,我想知道是否可以使用injection将这个< code>RestContext注入到我的资源和其他过滤器中(例如,我有一个过滤器,它从< code>RestContext中创建一个< code>SecurityContext),但是我找不到答案。一般来说,我如何根据请求上下文为每个请求注入一个对象?这可能吗?有没有更简单的方法,比如使用< code>@Context?
编辑:如前所述,我基本上试图在我的资源中注入一个与文档相同的自定义类。但是,我似乎无法正确注册我的 AbstractBinder
来绑定我的类的注入。我得到以下内容:
org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at Injectee(requiredType=RestContext,parent=RestContextFilter,qualifiers={}),position=0,optional=false,self=false,unqualified=null,1435496015)
编辑2:我设法取得了一些小进展。我按以下方式创建配置:
new ResourceConfig(allResources())
.packages(packagesToScan())
.registerInstances(new RestContextBinder());
因为文档清楚地指出,不支持通过类而通过实例注入绑定。
然而,我现在得到这个:
A MultiException has 3 exceptions. They are:
1. java.lang.IllegalStateException: Not inside a request scope.
2. java.lang.IllegalArgumentException: While attempting to resolve the dependencies of my.package.RestContextFilter errors were found
3. java.lang.IllegalStateException: Unable to perform operation: resolve on my.package.RestContextFilter
RestContext 在请求/响应筛选器中@Inject
。然后,它用于创建安全上下文
并在容器请求上下文中
设置它,并在响应筛选器中清理它。响应筛选器请求的作用域不是很大吗?为什么会出现此错误?
更新Jersey 2.7,解决方案更简单。
听起来您想要一个Request Scoped
绑定。以下是您可以如何使用泽西2.7进行设置:
您将需要一个请求过滤器,因为< code>RestContext将是< code>RequestScoped,所以您可以将一个提供者注入到您的过滤器中,在其上设置一些属性,并且知道它们将可用于请求的剩余部分。
@Priority(Priorities.AUTHORIZATION) // filter deals with roles, comes after AUTHENTICATION
public class RestContextFilter implements ContainerRequestFilter
{
// you need to inject a provider, rather than the class directly
// because this filter is instantiated before the request scope is ready
private Provider<RestContext> rcProvider;
@Inject
public RestContextFilter(Provider<RestContext> rcProvider)
{
this.rcProvider = rcProvider;
}
@Override
public void filter(ContainerRequestContext requestContext) throws IOException
{
// now you're in a request scope and can get your context
RestContext rc = rcProvider.get();
// set some properties on rc here (current user or roles or whatever)
}
}
您需要注册过滤器,并使用HK2绑定将< code>ResourceConfig中的< code>RestContext绑定到:
public class MyResourceConfig extends ResourceConfig
{
public MyResourceConfig()
{
register(RestContextFilter.class);
register(new AbstractBinder()
{
@Override
protected void configure()
{
bindFactory(new Factory<RestContext>()
{
@Override
public RestContext provide()
{
return new RestContext();
}
// this will get called at the end of the request
// allowing you to close your request scoped object
@Override
public void dispose(RestContext instance)
{
instance.close();
}
}, RequestScoped.class).to(RestContext.class).in(RequestScoped.class);
}
});
}
}
然后,您可以在您的资源中注入< code>RestContext,它将包含您的过滤器设置的所有信息。例如:
@Path("/my/path")
public class MyResource
{
private RestContext rc;
@Inject
public MyResource(RestContext rc)
{
this.rc = rc;
}
@POST
@Consumes(MediaType.APPLICATION_JSON)
public void upload(MyPostObj data)
{
// do stuff here, and rc is all set up
}
}
比起字段注入,我更倾向于构造函数注入,因为我认为这会让其他开发人员在阅读您的代码时更容易看到您的依赖性。也很抱歉,如果我的牙套风格惹恼了你,我来自一个奇妙的世界。网:)。
我正在学习并尝试构建一个rest api。但是我很难理解各种绑定之间的区别-、、以及范围-、和。它们之间有什么区别以及何时使用哪一个? e、 g.假设我有一些特定于请求的数据传入请求头。我想在请求处理期间多次使用此数据(比如在资源类、DAO等中)。我想到的是,我将使用,并使用 ContainerRequestContext提取数据,然后将其存储到某个类中。但我无法确定如何绑定这个类,以便以后可以访
注释如何在Jersey中工作,以便对特定的资源方法或资源类应用筛选器? 请考虑以下注释: 它是如何工作的?
我的球衣测试课有一个奇怪的问题。 当执行我的测试代码并在org.glassfish.jersey.message.internal.ReaderInterceptorExecutor的第203行放置断点时,我看到我的阅读器不在reader.workers.但是,正如您在下面看到的,我在ResourceConfig中注册了这个MessageBodyReader。 所有相关代码如下所示。 是的,返回为
我目前使用的是球衣 我现在要做的是设置泽西,这样当查询参数进来时(比如缩进),我可以告诉Jackson以“更漂亮的格式,也就是缩进”序列化JSON。您可以通过使用SerializationConfig.Feature.INDENT_OUTPUT配置JSON映射器来轻松地告诉Jackson这样做。 问题是,我如何在每个请求的基础上获取一个queryparam并使用它来修改Jackson的输出?
问题内容: 我正在使用Jersey创建REST API。我有一个POST方法,作为该方法的响应,应该将用户重定向到自定义URL ,因为它不必与API相关。 我在这里查看有关此主题的其他类似问题,但没有找到任何我可以使用的东西。 问题答案: 我建议更改JAX- RS注释方法的签名以返回对象。根据您打算重定向是永久重定向还是临时重定向(即客户端是否应更新其内部引用以反映新地址),该方法应构建并返回对应
我对Spring Security有这个问题。 我有一个带有SecurityConfig类的java配置实现,它扩展了WebSecurityConfigureAdapter。 在这个类中,我想重写方法“configure()” 一切正常,一切正常。 问题是Spring Context上没有加载“MyDaoAuthenticationProvider”组件。所以我无法注入或自动安装此类中的任何组件: