使用球衣和摇摇欲坠的api主体的API验证

时间:2019-04-09 20:57:47

标签: rest api swagger jersey-2.0

正在尝试使用请求主体构建REST post Web服务。 使用招摇号和平纹球衣。

我为Body的其中一种属性定义了以下内容:(伪造的示例)

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

如果传入请求中不包含CAT或DOG,我想抛出http 400异常。

但是,我从来没有机会处理数据并抛出Http 400。 相反,在Postman中,我得到了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)

所以看来,甚至在我没有机会验证杰克逊/昂首阔步/球衣正在做些事情之前,-我理想上也不希望他们这样做!

有什么想法吗?

更新: 根据娜塔莎(Natasha)的回答,尝试了以下方法,但仍然无法正常使用

选项#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:无法从字符串“ DONKEY”反序列化au.com.xyz.PetRequest $ PetTypeEnum类型的值:值不是声明的Enum实例名称之一:[CAT ,DOG],网址为[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 个答案:

答案 0 :(得分:1)

您可以禁用Jersey的自动发现功能: resourceConfig.property(CommonProperties.FEATURE_AUTO_DISCOVERY_DISABLE, true);,其中resourceConfig的类型为org.glassfish.jersey.server.ServerConfig。

这是Jersey的异常处理程序的现有线程:Jersey unable to catch any Jackson Exception

更新:

为解决Jackson错误:值不为声明的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));

    }
}

现有线程:Deserializing an enum with Jackson