Spring Boot验证:在错误消息中以{1}出现

时间:2017-12-12 12:20:06

标签: java spring validation spring-boot bean-validation

尝试使用spring boot在REST API中存档,

  1. 使用
  2. 注释的实体类
      

    @Size(分钟= 4,消息=" Size.foo.name&#34)

         

    私人字符串名称;

    1. errorMessages.properties如下所示,
    2.   

      errorMessages.properties
            Size.foo.name =名称字段必须大于{1}个字符

      1. 添加了以下自定义类建议,将spring错误消息映射到pojo错误样式。
      2. > @ControllerAdvice
        @PropertySource("classpath:errorMessages.properties")
        public class RestExceptionHandler 
        { 
        
        @Autowired
        private Environment environment;
        
        @ExceptionHandler(MethodArgumentNotValidException.class)
        @ResponseStatus(HttpStatus.BAD_REQUEST)
        
        public @ResponseBody ErrorDetail handleValidationError(MethodArgumentNotValidException manve, HttpServletRequest request) {
            List<FieldError> fieldErrors = manve.getBindingResult().getFieldErrors();
            for(FieldError fieldError : fieldErrors) {
                System.out.println(environment.getProperty(fieldError.getDefaultMessage())); //This prints Name field must be more than {1} characters
            }
            }
        
        }
        

        有没有办法我们可以打印如下的实际最小尺寸(4)并发送给用户,或者我是否需要在类中进行更多的配置更改?

          

        名称字段必须超过4个字符

2 个答案:

答案 0 :(得分:0)

我想我明白会发生什么。您只需检索邮件属性。邮件未被评估。

您需要一个MessageSource并将FieldError传递给消息源以获取消息。

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basenames" value="ValidationMessages"/>
</bean>

然后在控制器中自动装配源

@Autowired
private MessageSource messageSource;

要获得您的信息,请执行以下操作

for (Object object : bindingResult.getAllErrors()) {
    if(object instanceof FieldError) {
        FieldError fieldError = (FieldError) object;

        /**
          * Use null as second parameter if you do not use i18n (internationalization) or Locale to be specified if you need localized one
          */

        String message = messageSource.getMessage(fieldError, null);
    }
}

here

获取代码示例

答案 1 :(得分:0)

将最小值更改为最大值,最小值表示最小值为4.最大值表示最大值大约为20或任何您想要的值。

您输入 @Size(分钟= 4,消息= “Size.foo.name”)

私人字符串名称;

所以你必须输入超过4个字符或相等。 如果你取最大值而不是它的最高界限。比如,如果max = 20,则输入最多20个字符。 这里min是下限,所以你必须输入最少4个字符。

这是解决方案