2017-05-09 74 views
2

我想在杰克逊的春季启动应用程序中从JSON获取日期字段。该JSONFormat看起来是这样的:杰克逊接受否定日期

@NotNull(message = ValidationErrors.NOT_BLANK_MESSAGE) 
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyyMMdd") 
private Date date; 

它工作正常的大多数情况下,但是当我通过2017-0526,它会自动将其转换到5月10日,2018年

我想抛出异常如果日期不是yyyyMMdd格式或包含减号。我尝试过堆栈溢出和Jackson文档,但找不到任何东西。

为什么JsonFormat接受否定日期?

是否有任何解决方法,以便它在此类日期通过时抛出异常?

回答

3

这是解析日期的底层Java类的问题。该解析器默认为宽松的,并将解析看起来错误的日期。对于更严格的解析,您需要使用setLenient方法将宽松的属性设置为false。例如。用日期字符串“2017-0526”解析JSON时,这个设置将导致InvalidFormatException

ObjectMapper mapper = new ObjectMapper(); 
SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd"); 
df.setLenient(false); 
mapper.setDateFormat(df); 

在一瞬间,你无法通过@JsonFormat注释进行配置。似乎有一个2.9.0版本的计划。 Link to issue at github

+1

感谢它现在的工作。 @JsonFormat支持2.9的宽松功能。对于寻找语法的人来说,使用这个@JsonFormat(shape = JsonFormat.Shape.STRING,pattern =“yyyyMMdd”,lenient = OptBoolean.FALSE)。 – Saheb