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

{
  
  “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;
}

这是我的休息器

@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());
  }
}  

有没有人能告诉我怎么解决这个问题,因为我现在正在跟踪这个问题

推荐答案

@seenukarthi实际上是正确的.您必须在端点上使用@Valid才能使请求正文有效.

Note:验证错误在错误响应中不可见.

错误将显示在控制台日志(log)中.例如:

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]] ]

请仔细查看日志(log).它会在那里的.


现在,如果您想要捕获请求正文上发生的验证错误并将其包括到响应中,那么您必须使用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 :

对于不正确的数据:

enter image description here

对于正确的数据:

enter image description here

相应地更改逻辑.这只是一个例子.

Java相关问答推荐

当我用OkHttpClient重写shouldInterceptRequest来发布数据时,Android WebView正在以纯HTML加载URL内容

为什么Java中的两个日期有差异?

inteliJ中是否有一个功能可以自动在块注释中的/*后面添加一个空格?''

如何粘合(合并)文件Lucene?

为什么Java的代码工作(if condition内部的实例)

Exe4j创建的应用程序无法再固定在任务栏Windows 11上

如何找到MongoDB文档并进行本地化?

蒙蒂霍尔比赛结果不正确

如何正确创建序列图?

对于亚洲/香港,使用ResolverStyle.STRICT的LocalDate.parse返回意外结果

更新AWS凭据

Mac上的全屏截图在使用JavaFX时不能正常工作吗?

使用Jolt将字段转换为列表

对字符串长度进行排序,但颠倒了顺序(最长字符串在前)

try 使用类来包含JSON响应

如何在透视表中添加对计数列的筛选?

在Java泛型中使用通配符时,如何推断类型

如何使用jooq更新记录?

为什么Instant没有从UTC转换为PostgreSQL的时区?

JavaFX中ListView中的问题