验证RequestBody对象不检查NotNull

时间:2015-12-01 16:22:32

标签: java json spring spring-mvc jackson

我使用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本身。

0 个答案:

没有答案