如何使用javax验证验证java普通方法

如何使用javax验证验证java普通方法,java,spring,spring-boot,spring-boot-starter,Java,Spring,Spring Boot,Spring Boot Starter,我正在使用springbootstartervalidation验证javabean 控制器上的验证工作正常 我想知道是否可以使用@Valid annotation验证类的正常方法?我试过了,但没用 我在控制器上的工作解决方案 @PostMapping("/testMessage") ResponseEntity<String> testMethod(@Valid @RequestBody InternalMsg internalMsg) {

我正在使用
springbootstartervalidation
验证javabean

控制器上的验证工作正常

我想知道是否可以使用@Valid annotation验证类的正常方法?我试过了,但没用

我在控制器上的工作解决方案

@PostMapping("/testMessage")
    ResponseEntity<String> testMethod(@Valid @RequestBody InternalMsg internalMsg) {
        return ResponseEntity.ok("Valid Message");
    }
@PostMapping(/testMessage)
ResponseEntity testMethod(@Valid@RequestBody InternalMsg InternalMsg){
返回ResponseEntity.ok(“有效消息”);
}
我想将验证移到一个类方法中,这样当我点击RestAPI时,验证错误就会被捕获到一个新方法中

假设该方法是类MsgValidatorvalidateMsg,我在控制器代码中调用该方法

@PostMapping("/testMessage")
ResponseEntity<String> testMethod(@RequestBody InternalMsg internalMsg) { // No @Valid here
        MsgValidator msgValidator = new MsgValidator();
        Boolean isValid = msgValidator.validateMsg(internalMsg);
        // some other processings
        return ResponseEntity.ok("Valid Message");
}

public class MsgValidator{
   public boolean validateMsg(@Valid InteropMsg interopMsg){
     return true;
   }
   
   @ResponseStatus(HttpStatus.OK)
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<Ack> handleValidationExceptions(MethodArgumentNotValidException ex) {
        StringBuilder errorMessages = new StringBuilder("");
        ex.getBindingResult().getAllErrors().forEach((error) -> {
            errorMessages.append(error.getDefaultMessage()).append(";");
        });
        log.error("Validation errors : "+errorMessages.toString());
        return ResponseEntity.ok().body(ack);
    }
}

public class InternalMsg implements Serializable {
    @NotNull(message = "Msg Num is a required field")
    private String msgNumber;
    @NotNull(message = "Activity Name is a required field")
    private String activityName;
}

@PostMapping(/testMessage)
ResponseEntity testMethod(@RequestBody InternalMsg InternalMsg){//No@此处有效
MsgValidator MsgValidator=新的MsgValidator();
布尔值isValid=msgValidator.validateMsg(internalMsg);
//其他一些游行
返回ResponseEntity.ok(“有效消息”);
}
公共类MsgValidator{
公共布尔validateMsg(@Valid InteropMsg InteropMsg){
返回true;
}
@ResponseStatus(HttpStatus.OK)
@ExceptionHandler(MethodArgumentNotValidException.class)
公共响应处理例外(MethodArgumentNotValidException ex){
StringBuilder errorMessages=新的StringBuilder(“”);
例如:getBindingResult().getAllErrors().forEach((错误)->{
errorMessages.append(error.getDefaultMessage()).append(;);
});
log.error(“验证错误:+errorMessages.toString());
返回ResponseEntity.ok().body(ack);
}
}
公共类InternalMsg实现可序列化{
@NotNull(message=“Msg Num是必填字段”)
私有字符串msgNumber;
@NotNull(message=“活动名称是必填字段”)
私有字符串activityName;
}
这不起作用
请让我知道如何实现这一点下面是一个示例,说明如何使用
验证器工厂
获取
验证器
进行验证,而不是使用
@Valid
注释

    InternalMsg internalMsg = new InternalMsg();

    ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
    Validator validator = factory.getValidator();

    Set<ConstraintViolation<InternalMsg>> validate = validator.validate(internalMsg);
InternalMsg InternalMsg=new InternalMsg();
ValidatorFactory=Validation.buildDefaultValidatorFactory();
Validator Validator=factory.getValidator();
Set validate=validator.validate(internalMsg);
有关更多详细信息,请参见此处->


下面只是一个片段,不一定是使用
ValidationFactory

的推荐方法,我在这里也找到了一些与此相关的东西-但它是@ValidatedThank you,工作非常完美!