#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
списке. 🙁