没有@Validated的Spring JSR303 / 349验证

时间:2017-04-27 16:28:01

标签: java json spring validation jsonschema2pojo

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

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

@Validated
class SomeClass extends SomeGeneratedClass {

}

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

所以我的问题是:如果有问题的对象没有用@Validated注释,有没有办法在传入请求的春季触发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();
    }
}

我的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 个答案:

答案 0 :(得分:1)

在你的课程中,你要在同一行中定义和实例化数组。

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

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

这里有两个选择。

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

    私人名单userIds;

  2. 您可以更改验证。您可以使用@NotNull代替@Size(min=1),也可以同时使用它们。您也可以使用@NotEmpty,但需要使用休眠验证器。

答案 1 :(得分:0)

您可以使用Controller注释Service@Validated,而不是对需要验证的所有对象执行此操作,如下所示:

@Validated
@Controller
public class Controller {

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

答案 2 :(得分:0)

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

@Autowired
YourValidator validator;

@InitBinder()
protected void initBinder(WebDataBinder binder) {

    binder.setValidator(validador);

}

在您的终端

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