我使用Spring @RequestBody
和JacksonMapper来处理有效负载以进行REST调用。我的RestController
类是这样的:
@RequestMapping(value="/mobile/device", method=RequestMethod.PUT, consumes={MediaType.APPLICATION_JSON_VALUE}, produces=MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Object> flagDevice (@Valid @RequestBody List<DeviceInfo> deviceInfoList) {
...code here...
}
我的(本例简化)DeviceInfo
类看起来像这样:
@Entity
@JsonIgnoreProperties(ignoreUnknown=true)
public class DeviceInfo implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@JsonIgnore
private long id;
@NotNull(message="Must have valid activityDate parameter.")
@Past
private ZonedDateTime activityDate;
@JsonProperty("mobile-data")
@NotNull(message="Must have an associated MobileDeviceData object.")
private MobileDeviceData mobileDeviceData;
}
我正在使用Hibernate验证器org.hibernate:hibernate-validator:5.2.2.Final
。对我来说,似乎我没有在我的JSON中传递activityDate参数或嵌套的mobileDeviceData对象,然后在反序列化后它应该抛出异常。然而,这些值通过null就可以了。我做错了什么?
更新
在做了一些测试之后,我发现@Valid
和@Validated
只会验证List而不是它包含的对象。我通过将此@Bean
添加到我的Application类来实现此功能:
@Bean
public LocalValidatorFactoryBean localValidatorFactoryBean() {
return new LocalValidatorFactoryBean();
}
然后将其注入我的DeviceInfo
课程。然后我能够遍历List并使用
for (DeviceInfo deviceInfo : deviceInfoList) {
Set<ConstraintViolation<DeviceInfo>> violationSet = localValidatorFactory.validate(deviceInfo);
}
然后检查返回的Set for errors。这不是一个想法,并且想要告诉Spring验证List中的Objects而不是List本身。