Spring MVC Spring Validator注解不起作用

vuv7lop3  于 2023-11-22  发布在  Spring
关注(0)|答案(2)|浏览(203)

在我的请求体中,我以不同的方式传递参数进行验证。

{
  
  “name” : []
}

字符串
这里的操作正在执行,我想限制我的自定义错误消息。
在这里,我得到了400个错误的请求,所以如何处理这个正确的错误消息。
在我的控制器里,

if (myRequestResult.getName() == null || myRequestResult.getName().isEmpty()) {
    throw exceiption ()
 }else{
    myService.setName(myRequestResult.getName())
 }


这是工作正常,但现在我删除,并使用验证器注解。

@Data

public class MyResultRequest {
   @NotEmpty(message = "List of name must not be empty")
  @Size(min = 1, message = "List of name must have at least one element")
  private List<String> name;
}


这是我的restcontroller

@Log4j2
@RestController(value = "apiMyController")
@RequestMapping(path = "/api/v1/someRandomeURL")
@RequiredArgsConstructor(onConstructor = @__({@Autowired}))
public class ExecutionResultsController {
  
  @RequestMapping(method = RequestMethod.POST)
  public ExecutionResultDTO create(@RequestBody  MyRequestResult myRequestResult) throws Exception {
    
     myService.setName(myRequestResult.getName());
  }
}


有人能告诉我如何解决这个问题吗?

7cjasjjr

7cjasjjr1#

@seenukarthi实际上是正确的。您必须在端点上使用@Valid来验证请求体。
**注意:**验证错误在错误响应中不可见。

错误将显示在控制台日志中。示例:

2023-11-20T13:12:13.057+05:30  WARN 85261 --- [nio-8081-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument [0] in public org.springframework.http.ResponseEntity<java.lang.Object> com.example.TestController.create(com.example.MyRequestResult) with 2 errors: [Field error in object 'myRequestResult' on field 'name': rejected value [[]]; codes [NotEmpty.model.name,NotEmpty.name,NotEmpty.java.util.List,NotEmpty]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [model.name,name]; arguments []; default message [name]]; default message [List of name must not be empty]] [Field error in object 'model' on field 'name': rejected value [[]]; codes [Size.model.name,Size.name,Size.java.util.List,Size]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [model.name,name]; arguments []; default message [name],2147483647,1]; default message [List of name must have at least one element]] ]

字符串
请仔细查看日志,会有的
现在,如果你想捕获请求体上发生的验证错误并将其包含到响应中,那么你必须使用org.springframework.validation.BindingResult
让我用一个例子来说明:
更新ExecutionResultDTO,以便在可能的情况下也列出错误:

@Data
public class ExecutionResultDTO {

    private List<String> name;

    private List<String> errors;

}


更新了我用于测试的控制器:

import jakarta.validation.Valid;
import org.springframework.context.support.DefaultMessageSourceResolvable;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;

@RestController
public class TestController {

    @PostMapping("create")
    public ResponseEntity<ExecutionResultDTO> create(@Valid @RequestBody MyRequestResult myRequestResult, BindingResult bindingResult) {
        ExecutionResultDTO dto = new ExecutionResultDTO();
        dto.setName(myRequestResult.getName());
        if (bindingResult.hasErrors()) {
            dto.setErrors(bindingResult.getFieldErrors().stream()
                    .map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.toList()));
            return new ResponseEntity<>(dto, HttpStatus.BAD_REQUEST);
        }
        return new ResponseEntity<>(dto, HttpStatus.CREATED);
    }
}


Postman :
对于不正确的数据:
x1c 0d1x的数据
对于正确的数据:



相应地改变逻辑。这只是一个例子。

uwopmtnx

uwopmtnx2#

您需要将@javax.validation.Valid添加到rest控制器的参数中以启用验证。
所以你的休息控制器会像这样

@RequestMapping(method = RequestMethod.POST)
public ExecutionResultDTO create(@Valid @RequestBody  MyRequestResult myRequestResult) throws Exception {    
     myService.setName(myRequestResult.getName());
}

字符串

相关问题