使用@Valid和MessageSource在Spring Boot中获取显示错误时,无法获取JSON格式的错误对象

问题描述 投票:0回答:1

我目前正在学习Spring REST,我正在尝试构建一个演示spring boot应用程序。如果DTO对象有验证错误,我想显示如下:

{
  "errors": [
    {
      "code": "first_error_code",
      "message": "1st error message"
      "field":"field_name"
    }
  ]
}

上面JSON中的code应该显示我在实体类中给出的验证消息,即

@NotEmpty(message = "{name.not.empty}")
    String name;

然后代码应为name.not.empty,并且消息应从messages.properties文件中获取。

现在要实现这一点,我使用了一些教程。下面是类:

主类:(包含的MessageSource和LocalValidatorFactoryBean)

    @SpringBootApplication
    @EnableSwagger2
   public class Demo3PathvariableApplication implements WebMvcConfigurer {

        @Bean
        public MessageSource messageSource() {
            ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
            messageSource.setBasename("classpath:messages");
            messageSource.setDefaultEncoding("UTF-8");
            return messageSource;
        }

        @Bean
        public LocalValidatorFactoryBean validator(MessageSource messageSource) {
            LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
            bean.setValidationMessageSource(messageSource());
            return bean;
        }

        public static void main(String[] args) {
            SpringApplication.run(Demo3PathvariableApplication.class, args);
        }

        /*
         * To enable matrix variables, configurePathMatch() method of WebMvcConfigurer
         * needs to overriden. Matrix variables are disabled by default and the
         * following configuration
         * 
         * urlPathHelper.setRemoveSemicolonContent(false);
         * 
         * should be present in the overriden method to enable the same. see below
         * method.
         */

        @Override
        public void configurePathMatch(PathMatchConfigurer configurer) {
            UrlPathHelper urlPathHelper = new UrlPathHelper();
            urlPathHelper.setRemoveSemicolonContent(false);
            configurer.setUrlPathHelper(urlPathHelper);
        }

        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/**").allowedMethods("GET", "POST");
        }

        /* For Swagger Document Generation */
        @Bean
        public Docket api() {
            return new Docket(DocumentationType.SWAGGER_2).select()
                    .apis(RequestHandlerSelectors.basePackage("com.infytel.controller")).paths(PathSelectors.any()).build()
                    .useDefaultResponseMessages(false);
            // To scan for RestControllers from this package and For disabling default
            // response messages
        }

    }

控制器类:

@RestController
@RequestMapping("/customers")
@Api(value = "CustomerController, REST APIs that deal with Customer DTO")
public class CustomerController {

    @Autowired
    private CustomerService customerService;

    @PostMapping(consumes = "application/json")
    public ResponseEntity createCustomer(@RequestBody @Valid CustomerDTO customer, Errors errors) {
        return ResponseEntity.ok(customerService.createCustomer(customer));

    }
}

FieldErrorDTO.java:

    public class FieldErrorDTO {

        private String errorCode;
        private String message;
        private String field;

        public FieldErrorDTO(String errorCode, String message, String field) {
            this.errorCode = errorCode;
            this.message = message;
            this.field = field;
        }
//Getter setter

ValidationErrorDTO.java:

public class ValidationErrorDTO {

    private List<FieldErrorDTO> fieldErrors = new ArrayList<>();

    public ValidationErrorDTO() {
        super();
    }

    public void addFieldError(String errorCode, String message, String field) {
        FieldErrorDTO error = new FieldErrorDTO(errorCode, message, field);
        fieldErrors.add(error);
    }

    public List<FieldErrorDTO> getFieldErrors() {
        return fieldErrors;
    }

    public void setFieldErrors(List<FieldErrorDTO> fieldErrors) {
        this.fieldErrors = fieldErrors;
    }

}

RestErrorHandler .java

@ControllerAdvice
public class RestErrorHandler {

    @Autowired
    private MessageSource messageSource;

    @ResponseStatus(BAD_REQUEST)
    @ResponseBody
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ValidationErrorDTO processValidationError(MethodArgumentNotValidException ex) {
        BindingResult result = ex.getBindingResult();
        List<org.springframework.validation.FieldError> fieldErrors = result.getFieldErrors();
        return processFieldErrors(fieldErrors);
    }

    private ValidationErrorDTO processFieldErrors(List<FieldError> fieldErrors) {
        ValidationErrorDTO dto = new ValidationErrorDTO();
        for (FieldError fieldError : fieldErrors) {
            String localizedErrorMessage = resolveLocalizedErrorMessage(fieldError);
            dto.addFieldError(fieldError.getCode(), localizedErrorMessage, fieldError.getField());
        }

        return dto;
    }

    private String resolveLocalizedErrorMessage(FieldError fieldError) {
        Locale currentLocale = LocaleContextHolder.getLocale();
        String localizedErrorMessage = messageSource.getMessage(fieldError, currentLocale);

        return localizedErrorMessage;
    }

}

messages.properties

name.not.empty=Please provide a name.
email.not.valid=Please provide valid email id.
age.adult.only=Age should be more than 18.

现在有了所有这些配置,我就能在JSON下方看到],>

{
    "fieldErrors": [
        {
            "errorCode": "NotEmpty",
            "message": "Please provide a name.",
            "field": "name"
        },
        {
            "errorCode": "Email",
            "message": "Please provide valid email id.",
            "field": "email"
        }
    ]
}

我如何达到此要求,我要显示的不是“ errorCode”:“ NotEmpty”

 "errorCode": "name.not.empty"

来自CustomerDTO类?

我目前正在学习Spring REST,我正在尝试构建一个演示spring boot应用程序。如果DTO对象有验证错误,我想显示如下:{“错误”:[{“代码”:“ ...

spring spring-boot rest validation
1个回答
0
投票

为此,您需要更改processFieldErrors:

© www.soinside.com 2019 - 2024. All rights reserved.