Как зарегистрировать существующего поставщика Jersey MessageBodyReader для обработки дополнительных типов контента?

#java #jersey

#Ява #Джерси

Вопрос:

У меня есть веб-сервис REST, который обрабатывает запросы JSON. Я хочу реализовать в соответствии со спецификацией 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, на этот раз из-за того, что не может найти подходящее средство чтения текста сообщения.

У меня есть средство чтения сообщений, которое может обрабатывать входящие сообщения; «scim json» полностью обрабатывается как JSON. Однако я не могу изменить код библиотеки, чтобы добавить новую @Consumes аннотацию к существующему классу.

Есть ли способ сообщить Джерси, что этот класс может обрабатывать эти сообщения?

Ответ №1:

Мой текущий обходной путь заключается в создании нового класса:

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

и зарегистрируйте это, но это кажется немного банальным, и я хотел бы знать, есть ли лучший способ.

Редактировать: это также, похоже, не работает; похоже, что этот ScimJsonProvider иногда выбирается в качестве автора сообщений для application/json событий, а затем позже выдает 415, потому что это не тип, зарегистрированный в его @Produces списке. 🙁