如何将现有的Jersey MessageBodyReader提供程序注册为处理其他内容类型



我有一个处理JSON请求的REST Web服务。我想根据SCIM规范实现,以允许Azure AD集成在我的应用程序中为用户提供服务。

我已经写了方法:

@POST
@Path("/scim/Users")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
ScimUser createUser(@HeaderParam("Authorization") String authHeader,
ScimUser user);

但是,AAD正在使用Content-Type: application/scim+json进行请求,因此我的应用程序返回415:不支持媒体类型错误。

如果我换成

@Consumes({MediaType.APPLICATION_JSON, "application/scim+json"})

我的应用程序将请求路由到正确的方法,但仍然抛出415错误,这一次是因为它找不到合适的消息正文读取器。

我有一个MessageBodyReader,可以处理传入的消息"scim+json";完全可解析为JSON。但是,我不能修改库代码以在现有类上添加新的@Consumes注释。

有没有办法让Jersey知道这个类可以处理这些消息?

我目前的解决方法是创建一个新类:

@Provider
@Consumes(ScimService.SCIM_JSON_TYPE)
@Produces(ScimService.SCIM_JSON_TYPE)
public class ScimJsonProvider extends ExistingJsonProvider {
public ScimJsonProvider() {
super();
}
}

并注册,但这感觉有点棘手,我想知道是否有更好的方法。

编辑:这似乎也不起作用;似乎这个ScimJsonProvider有时被选为application/json事件的MessageBodyWriter,然后后来抛出415,因为这不是在其@Produces列表中注册的类型。:(

最新更新