在Spring Boot应用程序的REST调用中接受Enum的空字符串

时间:2018-05-19 07:34:22

标签: java spring spring-boot jackson spring-rest

我制作了一个Spring Boot 2 REST应用程序。我正在使用Angular来使用REST。我有枚举问题。

典型的枚举服务器端是:

public enum EngineType {
    DIESEL, METHANE, ELECTRIC;

    @Nullable
    public static EngineType valueOfNullable(String value) {
        try {
            return valueOf(value);
        } catch (Exception e) {
            return null;
        }
    }
}

有些实体将这些枚举用作字段,当然它们可以为null。不幸的是,当客户端发送实体的POST时发送"" (空字符串)用于枚举(因为它可以为null),我是一个错误服务器端:

org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `server.model.enums.EngineType` from String "": value not one of declared Enum instance names: [DIESEL, METHANE, ELECTRIC]; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `server.model.enums.EngineType` from String "": value not one of declared Enum instance names: [DIESEL, METHANE, ELECTRIC]
 at [Source: (PushbackInputStream); line: 1, column: 153] (through reference chain: server.model.tickets.Ticket["engineType2"])

我理解消息的意义,我可以解决创建自定义反序列化器的问题:

@Component
public class EngineTypeDeserializer extends JsonDeserializer<EngineType> {

    @Override
    public EngineType deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        JsonNode node = jp.getCodec().readTree(jp);
        return EngineType.valueOfNullable(node.asText());
    }

}

但是我应该在我的bean中的所有@JsonDeserialize(using = EngineTypeDeserializer.class)字段中添加此注释EngineType

我一直在寻找更好的方法来解决这个问题。你有什么建议吗?

1 个答案:

答案 0 :(得分:1)

您可以通过编程方式注册自定义序列化程序。

$_REQUEST课程中:

@Configuration