是否有一种优雅的方式(过滤器、钩子)在 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