Jersey JAXRS过滤器,在访问资源(web服务)之前提供解组实体



有没有一种优雅的方法(过滤器、钩子)可以在Jersey中拦截一个未组织的实体(及其注释),然后它才能到达web服务资源方法——那些用@POST、@PUT注释的方法。

我真的需要实体本身和它上面的任何注释,然后使用验证器注释的属性对该实体执行验证(看起来像JSR303,但我们没有用元数据对整个bean进行注释)。从资源的实现角度来看,我的目标是能够在资源方法中键入以下内容:

@Path("/people")
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public class PeopleService {
@POST
public Response createPerson(@CustomValidator("personValidator") Person person) throws URISyntaxException {
String uri = someService.createPerson(person);
return Response.created(new URI(uri)).entity(uri).build();
}
}

我开始编写自定义MessageBodyReader,并设法使JSON完全工作,因为我只是委托ObjectMapper来反序列化JSON。除此之外,我收到了参数的注释,一切都很顺利。然而,当我需要对XML进行反序列化时,事情就分崩离析了。我不知道如何获得Jersey会使用的原始反序列化程序并将其委托给它。我还觉得我不必要地重写了Jersey的部分,如果Jersey在MessageBodyReader之后和实现调用web资源服务之前有一个层,那么我更愿意停止使用MessageBodyReader作为一个棘手的集成点,该层将允许自己进行扩展,以便我可以向流中添加自定义行为。

最终,Jersey是否有任何扩展点,可以将未组装的实体及其任何参数控制台交给我,并允许我进行自定义处理?或者我必须自己弄清楚如何分解实体(使用JAXBContext或其他什么)?可能采用AOP?将验证器注入到资源类中,然后放弃注释的想法?

球衣版本:1.5

最终,Jersey有什么扩展点可以提供给我吗解组实体及其任何参数声明,以及允许我做定制处理吗?

是的,Jersey 1.x中有一个SPI,您可以在其中提供自己的方法调用程序。我从未实现过SPI,但据我所知,它是在任何MessageBodyReaders或筛选器之后调用的。查看ResourceMethodCustomInvokeDispatchProvider。来自Javadocs:

实现(服务提供商)通过放置提供者配置文件(如果还不存在),"com.sun.research.ws.rest.spi.invoker.ResourceMethodCustomInvokerDispatchProvider"在资源目录META-INF/services中,并包括文件中实现的合格服务提供程序类。

此接口类似于ResourceMethodDispatchProvider,但是允许使用自定义JavaMethodInvoker实例以进行最后的Java方法调用。

如果您实现ResourceMethodCustomInvokerDispatchProvider,您应该能够提供自己的JavaMethodInvoker,它将可以访问被调用的资源方法,包括其所有参数和注释。

请注意,上面的所有内容都适用于Jersey 1.x。在Jersey 2中,ResourceMethodInvocationHandlerProvider提供了类似的功能。

看看EJB拦截器:http://www.adam-bien.com/roller/abien/entry/interceptors_ejb_3_for_absolute

最新更新