Jersey JAXRS过滤器,在命中资源(Web服务)之前提供解组实体

时间:2012-12-13 19:02:10

标签: java java-ee jaxb jersey jax-rs

是否有一种优雅的方式(过滤器,钩子)在它击中Web服务资源方法之前拦截泽西岛中的解组实体(及其注释) - 那些使用@POST,@ PUT注释。

我真的需要实体本身及其上的任何注释,然后使用验证器注释的属性对该实体执行验证(看起来像JSR 303,但我们不使用元数据注释整个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作为hacky集成点。可以为流添加自定义行为。

最终,泽西岛是否有任何扩展点,它可以将未经编组的实体及其任何参数动作交给我,并允许我进行自定义处理?或者我是否必须弄清楚如何自己解组实体(使用JAXBContext或不使用)?可能诉诸AOP?将验证器注入资源类并放弃该注释理念?

泽西岛版:1.5

2 个答案:

答案 0 :(得分:2)

  

最终,泽西岛有任何可以交给我的延伸点   unmarshalled实体及其任何参数anntotations和   允许我做自定义处理吗?

是的,在Jersey 1.x中有一个SPI,您可以在其中提供自己的方法调用程序。我还没有实现SPI,但我的理解是它在任何MessageBodyReaders或过滤器之后被调用。看看ResourceMethodCustomInvokerDispatchProvider。来自Javadocs:

  

实现(服务提供者)通过放置a来标识自己   provider-configuration文件(如果尚未存在),   “com.sun.research.ws.rest.spi.invoker.ResourceMethodCustomInvokerDispatchProvider”   在资源目录META-INF / services中,包括完全   文件中实现的限定服务提供者类。

     

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

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

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

答案 1 :(得分:0)