61

次のように、Hibernate と Spring Annotations を使用して多くの検証を行っています。

public class Account {
    @NotEmpty(groups = {Step1.class, Step2.class})
    private String name;

    @NotNull(groups = {Step2.class})
    private Long accountNumber;

    public interface Step1{}
    public interface Step2{}
}

そして、コントローラでは、引数で呼び出されます:

public String saveAccount(@ModelAttribute @Validated({Account.Step1.class}) Account account, BindingResult result) {
   //some more code and stuff here
   return "";
}

しかし、コントローラーメソッドのロジックに基づいて、使用するグループを決定したいと思います。検証を手動で呼び出す方法はありますか? みたいなresult = account.validate(Account.Step1.class)

独自の Validator クラスを作成することは承知していますが、それは避けたいことです。クラス変数自体で注釈を使用することをお勧めします。

4

7 に答える 7

64

Spring は、Springインターフェースと Java Bean Validationインターフェースを実装するLocalValidatorFactoryBeanを提供します。SmartValidatorValidator

// org.springframework.validation.SmartValidator - implemented by LocalValidatorFactoryBean
@Autowired
SmartValidator validator;

public String saveAccount(@ModelAttribute Account account, BindingResult result) {
    // ... custom logic
    validator.validate(account, result, Account.Step1.class);
    if (result.hasErrors()) {
        // ... on binding or validation errors
    } else {
        // ... on no errors
    }
    return "";
}
于 2013-10-04T21:38:15.190 に答える
16

すべてが正しく構成されている場合は、次のことができます。

@Autowired
Validator validator;

次に、それを使用してオブジェクトを検証できます。

于 2013-10-04T21:25:57.963 に答える
1

また:

@Autowired
@Qualifier("mvcValidator")
Validator validator;

...
violations = validator.validate(account);
于 2016-11-21T14:29:08.613 に答える
0
import javax.validation.Validator;
import javax.validation.ConstraintViolation;

public class{
    @Autowired
    private Validator validator;
       .
       .
    public void validateEmployee(Employee employee){

        Set<ConstraintViolation<Employee>> violations = validator.validate(employee);
        if(!violations.isEmpty()) {
            throw new ConstraintViolationException(violations);
        }
    }
}

ここで、'Employee' は pojo クラスで、'employee' はそのオブジェクトです

于 2021-02-03T22:26:50.410 に答える