Java 如何手动触发spring验证?
从json请求体创建POJO时,POJO字段上的带注释的spring验证会起作用。但是,当我手动创建同一个对象(使用setter)并希望触发验证时,我不确定如何执行该操作 下面是注册类,它具有可以构建对象的生成器内部类。在构建方法中,我想触发spring验证。请滚动到底部并检查Builder.build()和Builder.valiate()方法以查看当前的实现。我使用javax.validation.Validator触发验证,但如果可能的话,我更喜欢利用spring验证Java 如何手动触发spring验证?,java,spring,spring-boot,bean-validation,Java,Spring,Spring Boot,Bean Validation,从json请求体创建POJO时,POJO字段上的带注释的spring验证会起作用。但是,当我手动创建同一个对象(使用setter)并希望触发验证时,我不确定如何执行该操作 下面是注册类,它具有可以构建对象的生成器内部类。在构建方法中,我想触发spring验证。请滚动到底部并检查Builder.build()和Builder.valiate()方法以查看当前的实现。我使用javax.validation.Validator触发验证,但如果可能的话,我更喜欢利用spring验证 package co
package com.projcore.dao;
import com.projcore.util.ToString;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import org.hibernate.validator.constraints.NotEmpty;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.validation.ConstraintViolation;
import javax.validation.Valid;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.constraints.Size;
import java.util.List;
import java.util.Set;
/**
* The data transfer object that contains the information of a Registration
* and validation rules for attributes.
*/
@JsonIgnoreProperties(ignoreUnknown = true)
public final class Registration {
private static final Logger LOGGER = LoggerFactory.getLogger(Registration.class);
private String id;
@NotEmpty
@Size(max = 255)
private String messageId;
@NotEmpty
@Size(max = 255)
private String version;
@Size(max = 255)
private String system;
public Registration() {
}
private Registration(Builder builder) {
this.id = builder.id;
this.messageId = builder.messageId;
this.version = builder.version;
this.system = builder.system;
}
public static Builder getBuilder() {
return new Builder();
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getMessageId() {
return messageId;
}
public void setMessageId(String messageId) {
this.messageId = messageId;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
public String getSystem() {
return system;
}
public void setSystem(String system) {
this.system = system;
}
@Override
public String toString() {
return ToString.create(this);
}
/**
* Builder pattern makes the object easier to construct in one line.
*/
public static class Builder {
private String id;
private String messageId;
private String version;
private String system;
private Builder() {}
public Builder id(String id) {
this.id = id;
return this;
}
public Builder messageId(String messageId) {
this.messageId = messageId;
return this;
}
public Builder version(String version) {
this.version = version;
return this;
}
public Builder system(String system) {
this.system = system;
return this;
}
public Registration build() {
Registration entry = new Registration(this);
// *** Would like to trigger spring validation here ***
Set violations = validate(entry);
if (violations.isEmpty())
return entry;
else
throw new RuntimeException(violations.toString());
}
private Set validate(Registration entry) {
Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
Set<ConstraintViolation<Registration>> constraintViolations = validator.validate(entry);
return constraintViolations;
}
}
}
解决方案: 已删除registration.Builder.validate()。已将registration.Builder.build()更新为: ValidationUtil.java
package projcore.util;
import com.ericsson.admcore.error.InvalidDataException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.validation.BeanPropertyBindingResult;
import org.springframework.validation.Errors;
import org.springframework.validation.beanvalidation.SpringValidatorAdapter;
import javax.validation.Validation;
import javax.validation.Validator;
import java.util.Set;
public class ValidatorUtil {
private static final Logger LOGGER = LoggerFactory.getLogger(ValidatorUtil.class);
private static final Validator javaxValidator = Validation.buildDefaultValidatorFactory().getValidator();
private static final SpringValidatorAdapter validator = new SpringValidatorAdapter(javaxValidator);
public static Object validate(Object entry) {
Errors errors = new BeanPropertyBindingResult(entry, entry.getClass().getName());
validator.validate(entry, errors);
if (errors == null || errors.getAllErrors().isEmpty())
return entry;
else {
LOGGER.error(errors.toString());
throw new InvalidDataException(errors.getAllErrors().toString(), errors);
}
}
}
InvalidDataException.java
package projcore.error;
import org.springframework.validation.Errors;
/**
* This exception is thrown when the dao has invalid data.
*/
public class InvalidDataException extends RuntimeException {
private Errors errors;
public InvalidDataException(String msg, Errors errors) {
super(msg);
setErrors(errors);
}
public Errors getErrors() {
return errors;
}
public void setErrors(Errors errors) {
this.errors = errors;
}
}
Spring提供了对JSR-303bean验证API的全面支持。这包括方便地支持将JSR-303实现引导为Springbean。这允许在应用程序中需要验证的任何地方注入javax.validation.Validator 使用LocalValidatorFactoryBean将默认JSR-303验证器配置为SpringBean:
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />
如果您的bean需要Spring验证API,则插入对org.springframework.validation.Validator的引用:
// Spring Validator
import org.springframework.validation.Validator;
@Service
public class MyService {
@Autowired
private Validator validator;
}
这里有一个很好的例子
这个链接非常有用。在中包装javax.validation.Validator
org.springframework.validation.beanvalidation.SpringValidatorAdapter
帮助始终如一地处理错误。你能加上这个作为答案吗
我可以接受
及
我认为Spring Boot还为您提供了验证器bean(并不是说您自己很难做到)。这是否意味着Spring Validator只能在@Service类中用于触发验证?我已经在网上读了足够多的书,所以看到过这样的例子,但我仍然不明白如何在POJO中做到这一点,因此我提出了这个问题。我还知道如何触发自定义验证器的验证,但不知道如何触发POJO中的默认验证。如果可能的话,您可以在我所拥有的上下文中提供具体的答案。您可以将验证器注入任何Springbean。这里有一个古老的例子。如果你还有问题,请在此发表评论。此链接非常有用。在org.springframework.validation.beanvalidation.SpringValidatorAdapter中包装javax.validation.Validator有助于一致地处理错误。你能把这个添加为我可以接受的答案吗?我已经编辑了这个答案以包含链接,所以你可以接受这个答案,我很高兴我能提供帮助
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />
// JSR-303 Validator
import javax.validation.Validator;
@Service
public class MyService {
@Autowired
private Validator validator;
}
// Spring Validator
import org.springframework.validation.Validator;
@Service
public class MyService {
@Autowired
private Validator validator;
}