7

是否有一种优雅的方式(过滤器、钩子)在 Jersey 中拦截未编组的实体(及其注释),然后再访问 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 集成点,这样我可以向流程中添加自定义行为。

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

球衣版本:1.5

4

2 回答 2

2

最终,泽西岛是否有任何扩展点可以将未编组的实体及其任何参数注释交给我并允许我进行自定义处理?

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

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

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

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

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

于 2013-12-16T15:30:26.260 回答
0

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

于 2013-05-28T11:11:20.430 回答