当前位置: 首页 > 知识库问答 >
问题:

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

壤驷凯
2023-03-14
{
  "errors": [
    {
      "code": "first_error_code",
      "message": "1st error message"
      "field":"field_name"
    }
  ]
}
@NotEmpty(message = "{name.not.empty}")
    String name;

现在为了实现这一点,我使用了几个教程。以下是课程:

主类:(包括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));

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

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

}
name.not.empty=Please provide a name.
email.not.valid=Please provide valid email id.
age.adult.only=Age should be more than 18.
{
    "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 Class?

共有1个答案

嵇出野
2023-03-14

为此,您需要更改processfielderrors:

首先从您的拼写中删除“{}”:

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

第二:

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

        return dto;
    }
private String resolveLocalizedErrorMessage(FieldError fieldError) {
        Locale currentLocale = LocaleContextHolder.getLocale();
        String localizedErrorMessage = messageSource.getMessage(fieldError.getDefaultMessage(), null, currentLocale);

        return localizedErrorMessage;
    }
name.not.empty
 类似资料:
  • 问题内容: 我正在使用位于此处的教程:http : //addyosmani.github.io/backbone-fundamentals/#create- a-simple-web-server 并添加了以下代码。 在启动服务器后,我收到一条错误消息,指出访问时的错误,我只是想知道是否有人对这个错误了解很多,因为Express和Node对我来说是新的? 问题答案: 我认为您缺少路线,您需要定义

  • 我在第二个脚本中得到错误。请解释为什么我在第二个脚本中得到错误。 从LCL_SHR_IncidentIntegrationInt中选择count(*),其中externalsystem='ipsoft'和(to_char(sysdate,'yyyymmddhh24miss')-to_char(fn_adjusted_date(CREATE_DATE),'yyyymmddhh24miss'))>18

  • 我是js/handlebars的新手,我无法用VS代码显示来自我的home.hbs文件的图像。当我运行服务器时,我得到的是: 这是我的服务器代码: 我的“home.hbs”代码: get“错误特别声明 无法获取/public/img/logo.png 这是我所有的信息,任何帮助将非常感谢。

  • 问题内容: 我有一个HTTP API,无论成功还是失败,它都会返回JSON数据。 失败示例如下所示: 我想要在JavaScript代码中实现的是这样的: 问题答案: fulfilled return Promise.reject(resp.json()); 好吧,诺言 将 得到兑现,只是不等待它,而是立即 兑现诺言 。 我假设您宁愿执行以下操作: (或明确写出)

  • 问题内容: 我正在尝试从json文件读取。 这是我创建文件的方式: 这是我输出的开始: 当我尝试使用以下代码读取同一文件时: 我得到错误 我不明白,因为我可以像往常一样崇高地打开文件。我该如何处理? 使用以下代码解决了该问题: 问题是我混合了转储和负载。现在我正在使用转储和加载 问题答案: 用于加载文件。与字符串一起使用。

  • 所以,我从用户提示输入变量。如果变量小于0且大于10。如果用户输入