【问题标题】:Getting 500 response status (Internal server error) for BAD request获取 BAD 请求的 500 响应状态(内部服务器错误)
【发布时间】:2022-11-29 07:00:20
【问题描述】:

当在名为 Entries 的列表中传递 null 或没有值时,我希望响应状态为 400 BAD Request。 我创建了一个自定义验证 @ValidList 来实现这一点。但是,我得到的不是 400 BAD Request,而是 500 Internal Server Error 响应。我怎样才能解决这个问题?

我的班级结构:

public class RequestAPI{
    @PostMapping(value = "/request",
        consumes = MediaType.APPLICATION_JSON_VALUE,
        produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity request(
        @Valid @NotNull @RequestBody(required = false) Data data) { }
}
@ValidList
public class Data extends ArrayList<@Valid Entries> { }

public class Entries {
  @NotNull
  String firstName

  @NotNull
  String lastName
}

验证器类:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ METHOD, FIELD, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Constraint(validatedBy = ListValidator.class)
public @interface ValidList  {
    String message() default "List cannot empty or contain null values";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}


public class ListValidator implements ConstraintValidator<ValidList, List<? extends Object>> {
    @Override
    public boolean isValid(List<? extends Object> list,
                           ConstraintValidatorContext context) {
        return !(list == null || list.isEmpty() || list.stream().anyMatch(Objects::isNull));
        //  mark the list invalid is empty or contains any null values.
    }

    @Override
    public void initialize(ValidList constraintAnnotation) {}

【问题讨论】:

    标签: java spring-boot annotations


    【解决方案1】:

    很难确定,因为您没有共享生成 500 错误的堆栈跟踪,但您可能需要以某种方式处理异常。 假设异常是ConstraintViolationException,您可以使用@RestControllerAdvice捕获异常:

    @RestControllerAdvice
    public class ApiExceptionHandler extends ResponseEntityExceptionHandler {
    
        @ExceptionHandler(value = {ConstraintViolationException.class})
        public ResponseEntity<Object> handleApiRequestException(ConstraintViolationException ex) {
    
            logger.error(ex.getMessage(), ex);
    
            // ...handle the exception
    
            return new ResponseEntity<>("Error message body", HttpStatus.BAD_REQUEST);
        }
    }
    

    想了解更多关于Spring Web异常处理的知识,可以参考文档https://docs.spring.io/spring-framework/docs/5.3.15/reference/html/web.html#mvc-ann-exceptionhandler

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-19
      • 2019-08-18
      • 2015-09-20
      相关资源
      最近更新 更多