gpt4 book ai didi

java - 没有 @Validated 的 Spring JSR303/349 验证

转载 作者:行者123 更新时间:2023-11-30 10:30:34 25 4
gpt4 key购买 nike

我正在使用 jsonschema2pojo 从 json 模式生成 POJO。我想使用 jsr303/349 bean 验证工具。我将必要的项目添加到类路径中,添加了必要的 bean 来触发验证,但是 jsonschema2pojo 不会将 @org.springframework.validation.annotation.Validated 添加到生成的类中,因此验证不会当请求进入我的 spring boot 应用程序时不会被触发。

我能够通过像这样编写一个空类并将 @RequestBody 类型更改为新类型来确认我的 validator 设置正确:

@Validated
class SomeClass extends SomeGeneratedClass {

}

当我这样做时,验证按预期工作。然而,我们正在研究数十个(如果不是可能的话)一百个或更多的扩展对象,并且其中有一堆是湿代码(IE,而不是 DRY)的缩影,因此这作为解决方案并不理想。

所以我的问题是:如果所讨论的对象未使用 @Validated 注释,是否有一种方法可以在传入请求时在 spring 中触发 bean 验证?请注意,jsonschema2pojo 目前对 Spring 没有依赖关系,我发现作者不太可能接受添加一个的拉取请求。

-- 有帮助就打码

示例 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();
}
}

我的 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();
}

还有我的 Controller 方法:

@RequestMapping(value = "", method = RequestMethod.POST)
public void postExample(@RequestBody @Valid ExampleSchema example) {
//Perform actions on validated object
}

最佳答案

在您的类(class)中,您将在同一行中定义和实例化数组。

private List<String> userIds = new ArrayList<String>();

因此,当 Spring 验证对象时,List userIds 不为空。

这里有两个选择。

  1. 您可以删除 userIds 的实例化。

    私有(private)列表 userIds;

  2. 您可以更改验证。您可以使用 @Size(min=1) 或者您可以同时使用它们,而不是使用 @NotNull。您也可以使用 @NotEmpty,但您需要 hibernate validator 。

关于java - 没有 @Validated 的 Spring JSR303/349 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43663275/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com