Java Jersey JAXRS筛选器,在命中资源(web服务)之前提供未经签名的实体

Java Jersey JAXRS筛选器,在命中资源(web服务)之前提供未经签名的实体,java,jakarta-ee,jaxb,jersey,jax-rs,Java,Jakarta Ee,Jaxb,Jersey,Jax Rs,有没有一种优雅的方法(过滤器、钩子)可以在Jersey中拦截一个未经授权的实体(及其注释),然后再访问web服务资源方法-那些用@POST、@PUT注释的方法 我真的需要实体本身及其上的任何注释,然后使用验证器注释的属性对该实体执行验证(看起来像JSR303,但我们不使用元数据注释整个bean)。从资源的实现角度来看,我的目标是能够在资源方法中键入: @Path("/people") @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICA

有没有一种优雅的方法(过滤器、钩子)可以在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的各个部分,如果Jersey在MessageBodyReader之后有一个层,并且在实现调用web资源服务之前,允许自己进行扩展,以便我可以向流中添加自定义行为,那么我宁愿停止使用MessageBodyReader作为黑客集成点

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


Jersey版本:1.5

看看EJB拦截器:

归根结底,泽西岛是否有任何可供我使用的扩展点 取消编组的实体及其任何参数注释和 允许我做海关手续吗

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

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

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

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


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

是Java EE 5还是6?您是否碰巧使用了Guice或Spring?这对我来说似乎是件好事。我知道这在中是可能的,但我认为Jersey没有提供类似的接口。我们确实在使用Spring,JEE版本是6。是的,那些CXF拦截器就是我要找的。在泽西岛还没有看到类似的。泽西岛没有。为什么在一个项目中同时需要Spring和CDI?真奇怪。如果youtbean是一个cdibean,那么您应该能够使用它来检查参数。它不完全是一个新项目,而且已经投入生产。Spring从一开始就在那里,我们没有时间移除它,而且这有可能破坏东西。我将研究拦截器绑定,看看我能做些什么。