java Spring JSR303/349验证,无@Validated
我使用jsonschema2pojo从json模式生成POJO。我想使用jsr303/349bean验证工具。我向类路径添加了必要的项,添加了触发验证所需的bean,但是jsonschema2pojo不会向生成的类添加@org.springframework.validation.annotation.Validated
,因此当请求进入我的spring引导应用程序时不会触发验证
我可以通过编写一个空类(如so)并将@RequestBody
类型更改为新类型来确认我的验证器设置正确:
@Validated
class SomeClass extends SomeGeneratedClass {
}
当我这样做时,验证工作正如预期的那样。然而,我们正在研究几十个(如果不是潜在的一百个)或更多的扩展对象,其中有一堆是湿代码(即非干代码)的缩影,因此这不是理想的解决方案
所以我的问题是:如果所讨论的对象没有用@Validated
注释,那么有没有一种方法可以在spring中对传入请求触发bean验证?请注意,jsonschema2pojo目前没有对Spring的依赖,我发现作者不太可能接受添加了一个依赖项的pull请求
--如果有帮助,请编写代码
JSON模式示例:
{
"type": "object",
"properties": {
"userIds": {
"type": "array",
"items": { "type": "string" },
"minSize": 1
}
},
"additionalProperties": false,
"required": ["userIds"]
}
生成的类:
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"userIds"
})
public class ExampleSchema {
/**
*
* (Required)
*
*/
@JsonProperty("userIds")
@Valid
@NotNull
private List<String> userIds = new ArrayList<String>();
/**
*
* (Required)
*
*/
@JsonProperty("userIds")
public List<String> getUserIds() {
return userIds;
}
/**
*
* (Required)
*
*/
@JsonProperty("userIds")
public void setUserIds(List<String> userIds) {
this.userIds = userIds;
}
public ExampleSchema withUserIds(List<String> userIds) {
this.userIds = userIds;
return this;
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
@Override
public int hashCode() {
return new HashCodeBuilder().append(userIds).toHashCode();
}
@Override
public boolean equals(Object other) {
if (other == this) {
return true;
}
if ((other instanceof ExampleSchema) == false) {
return false;
}
ExampleSchema rhs = ((ExampleSchema) other);
return new EqualsBuilder().append(userIds, rhs.userIds).isEquals();
}
}
my WebConfig中的验证bean设置:
@Bean
public MethodValidationPostProcessor methodValidationPostProcessor(LocalValidatorFactoryBean validator) {
final MethodValidationPostProcessor methodValidationPostProcessor = new MethodValidationPostProcessor();
methodValidationPostProcessor.setValidator(validator);
return methodValidationPostProcessor;
}
@Bean
public LocalValidatorFactoryBean validator() {
return new LocalValidatorFactoryBean();
}
和我的控制器方法:
@RequestMapping(value = "", method = RequestMethod.POST)
public void postExample(@RequestBody @Valid ExampleSchema example) {
//Perform actions on validated object
}
# 1 楼答案
您可以用
@Validated
注释Controller
或Service
,而不是对所有需要验证的对象进行注释,如下所示:# 2 楼答案
在类中,您在同一行中定义和实例化数组
因此,当Spring验证对象时,列表userid不为null
你有两个选择
您可以删除userid的实例化
私有列表用户ID
您可以更改验证。你可以使用
@Size(min=1)
或者两者都可以,而不是使用@NotNull
。也可以使用@NotEmpty
,但需要hibernate验证器# 3 楼答案
在控制器中创建一个initbinder,如下所示:
在你的终点