有没有一种优雅的方式(过滤器,钩子)在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吗?将验证器注入资源类并放弃注释的想法?
Jersey版本: 1.5
发布于 2013-12-16 15:30:26
归根结底,Jersey有没有任何扩展点,在那里它可以给我未编组的实体和它的任何参数声明,并允许我进行自定义处理?
是的,在Jersey 1.x中有一个SPI,您可以在其中提供自己的方法调用器。我从未实现过SPI,但据我所知,它是在任何MessageBodyReaders或过滤器之后调用的。看看ResourceMethodCustomInvokerDispatchProvider吧。在Javadoc中:
服务实现(服务提供者)通过将提供者配置文件(如果不存在) "com.sun.research.ws.rest.spi.invoker.ResourceMethodCustomInvokerDispatchProvider“放在资源目录META-INF/
中,并在文件中包含该实现的完全限定的服务提供者类来标识自己。
该接口类似于ResourceMethodDispatchProvider,但允许使用自定义的JavaMethodInvoker实例,该实例将用于进行最终的Java方法调用。
如果您实现了ResourceMethodCustomInvokerDispatchProvider,您应该能够提供您自己的JavaMethodInvoker,它将能够访问被调用的资源方法,包括它的所有参数和注释。
请注意,以上所有内容都适用于Jersey 1.x。在Jersey 2中,ResourceMethodInvocationHandlerProvider提供了类似的功能。
发布于 2013-05-28 11:11:20
https://stackoverflow.com/questions/13866613
复制相似问题