проверка API для тела сообщения с использованием джерси и чванства - PullRequest
0 голосов
/ 09 апреля 2019

Пытаюсь создать почтовый веб-сервис REST с телом запроса. Использование чванства и трикотажа для одного и того же.

Я определил следующее для одного из атрибутов Тела: (надуманный пример)

 petType:
            description: Type of Pet
            type: string
            enum:
                - CAT
                - DOG

Я хотел бы выдать исключение http 400 в случае входящего запроса, не содержащего CAT или DOG.

Однако у меня никогда не было возможности обработать данные и выдать Http 400. Вместо этого в Почтальоне я получаю HTTP 500. Stacktrace:

Caused by: com.fasterxml.jackson.databind.exc.InvalidFormatException: Can not deserialize value of type au.com.xyz.PetRequest$PetTypeEnum from String "DONKEY": value not one of declared Enum instance names: [CAT, DOG] at [Source: org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@12b7aa1a; line: 4, column: 14] (through reference chain: au.com.xyz.PetPromoRequest["petType"])
at com.fasterxml.jackson.databind.exc.InvalidFormatException.from(InvalidFormatException.java:74)
at com.fasterxml.jackson.databind.DeserializationContext.weirdStringException(DeserializationContext.java:1410)
at com.fasterxml.jackson.databind.DeserializationContext.handleWeirdStringValue(DeserializationContext.java:926)
at com.fasterxml.jackson.databind.deser.std.EnumDeserializer._deserializeAltString(EnumDeserializer.java:189)
at com.fasterxml.jackson.databind.deser.std.EnumDeserializer.deserialize(EnumDeserializer.java:126)
at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:504)
at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:104)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:276)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:140)
at com.fasterxml.jackson.databind.ObjectReader._bind(ObjectReader.java:1583)
at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:964)

Похоже, что даже прежде, чем я получу возможность проверить, что Джексон / Сваггер / Джерси занимаются чем-то, чего я в идеале не хочу!

Есть мысли, пожалуйста?

UPDATE: Исходя из ответа Наташа попробовала следующее и все равно не работает

вариант # 1 Добавлена ​​аннотация @Priority в маппере исключений:

@Provider
@Priority(1)
public class AppExceptionMapper implements ExceptionMapper<AppException> {

Это не сработало.

вариант # 2 Добавлено следующее в web.xml:

 <servlet>
    <servlet-name>jersey</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>jersey.config.server.disableAutoDiscovery</param-name>
        <param-value>true</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

Я получаю одно и то же исключение:

Причина: com.fasterxml.jackson.databind.exc.InvalidFormatException: Невозможно десериализовать значение типа au.com.xyz.PetRequest $ PetTypeEnum из строки «DONKEY»: значение не одно из объявленных имен экземпляров Enum: [CAT , СОБАКА] в [Source: org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@12b7aa1a; строка: 4, столбец: 14] (через цепочку ссылок: au.com.xyz.PetPromoRequest ["petType"]) в com.fasterxml.jackson.databind.exc.InvalidFormatException.from (InvalidFormatException.java:74) на com.f

1 Ответ

1 голос
/ 10 апреля 2019

Вы можете отключить функцию автоматического обнаружения Джерси: resourceConfig.property(CommonProperties.FEATURE_AUTO_DISCOVERY_DISABLE, true);, где resourceConfig имеет тип org.glassfish.jersey.server.ServerConfig.

Вот существующий поток для обработчика исключений Джерси: Джерси не удалосьперехватить любое исключение Джексона

ОБНОВЛЕНИЕ:

Для устранения ошибки Джексона: значение не одно из объявленных имен экземпляров Enum

Вы можете вызвать желаемое исключение, используя @JsonCreater:

public enum PET {
    CAT("cat"),
    DOG("dog");

    private static MappingChange.Map<String, PET> FORMAT_MAP = Stream
            .of(PET.values())
            .collect(Collectors.toMap(s -> s.formatted, Function.identity()));

    private final String formatted;

    PET(String formatted) {
        this.formatted = formatted;
    }

    @JsonCreator // This is the factory method and must be static
    public static PET fromString(String string) {
               // Throw desirable exception here
        return Optional
                .ofNullable(FORMAT_MAP.get(string))
                .orElseThrow(() -> new IllegalArgumentException(string));

    }
}

Существующий поток: Десериализация перечисления с Джексоном

...