【问题标题】:Downloading local error message ConstraintViolationException下载本地错误消息 ConstraintViolationException
【发布时间】:2017-09-27 16:49:59
【问题描述】:

弹簧靴。我有一个验证参数的服务

@Override
public void registerUser(
        @Valid RegisterDTO registerDTO
) {

验证的字段是 e。 G。

@NotEmpty
@Pattern(regexp = "[a-zA-Z0-9_-]{6,36}")
private String username;

然后我设置 ExceptionHandler 来处理这个异常

@ExceptionHandler(ConstraintViolationException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public ValidationErrorDTO processValidationError(ConstraintViolationException ex) {
    ValidationErrorDTO validationErrorDTO = new ValidationErrorDTO();

    Set<ConstraintViolation<?>> set =  ex.getConstraintViolations();

    for (Iterator<ConstraintViolation<?>> iterator = set.iterator();iterator.hasNext(); ) {
        ConstraintViolation<?> next =  iterator.next();

        validationErrorDTO.getFieldErrors()
                .add(new ErrorFieldDTO(((PathImpl)next.getPropertyPath()).getLeafNode().getName(),
                        next.getMessage()));
    }

    return validationErrorDTO;
}

我有一个验证消息。我保存错误消息的属性文件

NotEmpty.registerDTO.username=This field is required.
Pattern.registerDTO.username=Please enter at least 6 characters(max. 36 characters). Only letters, numbers and special characters '_' and '-'.

但是,此操作的结果似乎是 https://zapodaj.net/d1a4f695e6a7d.png.html

不从中检索本地消息。属性文件。

如何设置从属性文件下载本地消息?

【问题讨论】:

    标签: java spring spring-mvc spring-boot


    【解决方案1】:

    好吧,您必须为 Hibernate 配置自定义验证消息。第一个 bean 将验证消息的位置配置到自定义 validationMessages 文件(使用任何名称)。在WebMvcConfigurerAdapter 中可以@Override getValidator() 方法返回自定义的Validator。

    @Bean(name = "messageSource")
    public MessageSource messageSource() {
        ReloadableResourceBundleMessageSource rrbms = new ReloadableResourceBundleMessageSource();
        rrbms.setBasename("classpath:validationMessages");
        rrbms.setDefaultEncoding("UTF-8");
        return rrbms;
    }
    
    @Bean(name = "validator")
    public LocalValidatorFactoryBean validator() {
        LocalValidatorFactoryBean lvfb = new LocalValidatorFactoryBean();
        lvfb.setValidationMessageSource(messageSource());
        return lvfb;
    }
    
    @Override
    public Validator getValidator() {
        return validator();
    }
    

    由于您可以使用默认名称 validationMessages.properties,或者如果您使用 WebConfigurationSupport,则最小设置为:

    @Override
    public Validator getValidator() {
        LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();
        validator.setValidationMessageSource(messageSource());
        return validator;
    }
    

    无论如何,您必须使用message引用正确的属性。

    @Pattern(regexp = "[a-zA-Z0-9_-]{6,36}", message="{Pattern.registerDTO.username}")
    

    一个好的做法是不要根据它正在验证的字段来命名属性,而是根据验证的类型。

    validation.notEmpty=This field is required.
    validation.pattern.username=Please enter at least 6 characters(max. 36 characters). Only letters, numbers and special characters '_' and '-'.
    validation.pattern.email=...
    validation.pattern.phone=...
    validation.size=...
    

    【讨论】:

    • 请输入至少 6 个字符(最多 36 个字符)。我想从另一个属性/变量中获取 6 或 36,我不想在消息中像这样对其进行硬编码,我将如何去做?
    • @Denson:看看这个答案:stackoverflow.com/a/36148965/3764965你可以组合属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    相关资源
    最近更新 更多