有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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
}

共 (3) 个答案

  1. # 1 楼答案

    您可以用@Validated注释ControllerService,而不是对所有需要验证的对象进行注释,如下所示:

    @Validated
    @Controller
    public class Controller {
    
        @RequestMapping(value = "", method = RequestMethod.POST)
        public void postExample(@RequestBody @Valid ExampleSchema example){
           //Perform actions on validated object
        }
    }
    
  2. # 2 楼答案

    在类中,您在同一行中定义和实例化数组

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

    因此,当Spring验证对象时,列表userid不为null

    你有两个选择

    1. 您可以删除userid的实例化

      私有列表用户ID

    2. 您可以更改验证。你可以使用@Size(min=1)或者两者都可以,而不是使用@NotNull。也可以使用@NotEmpty,但需要hibernate验证器

  3. # 3 楼答案

    在控制器中创建一个initbinder,如下所示:

    @Autowired
    YourValidator validator;
    
    @InitBinder()
    protected void initBinder(WebDataBinder binder) {
    
        binder.setValidator(validador);
    
    }
    

    在你的终点

    public OrdenServicioTo guardarOrden(@ModelAttribute("dto")@Validated @RequestBody Object dto)
    {
        ///YOurCode
    }