是否有一种优雅的方式(过滤器,钩子)在它击中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
答案 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)