微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

嵌套对象中的Spring @valid无法从messages.properties检索消息

如何解决嵌套对象中的Spring @valid无法从messages.properties检索消息

我有添加方法具有DTO的控制器:

@PostMapping(consumes = "application/json")
@ResponseStatus(HttpStatus.CREATED)
public String add(@RequestBody ProductDTO productDTO) {
   //...
}

DTO具有应验证的实体字段:

@Data
@NoArgsConstructor
public class ProductDTO {
    @Valid
    Product product;
    //...
}

产品类具有从messages.properties中检索消息的约束:

@Entity
@Table(name = "products")
@Data
@NoArgsConstructor
public class Product {
    @NotNull(message = "{error.notNull}")
    @Size(min = 1,max = 50,message = "{products.error.nameSize}")
    private String name;
    //...
}

为了将验证器绑定到messages.properties,我设置了配置类:

@Configuration
@EnableWebMvc
public class WebConfiguration implements WebMvcConfigurer {
    @Bean
    public MessageSource messageSource() {
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        messageSource.setdefaultencoding("UTF-8");
        messageSource.setBasename("classpath:messages");
        return messageSource;
    }

    @Bean
    @Override
    public Validator getValidator() {
        LocalValidatorfactorybean localValidatorfactorybean = new LocalValidatorfactorybean();
        localValidatorfactorybean.setValidationMessageSource(messageSource());
        return localValidatorfactorybean;
    }
}

如果我尝试检查Product类的有效性并发送JSON数据,如下所示:

{
  "name": null
}

或者:

{
   "name": ""
}

然后我有以下消息:

{error.notNull}

或者:

{products.error.nameSize}

那是消息变量的名称,而不是它的值。 如果我在控制器的add方法中使用Product类而不是ProductDTO类,则一切正常,消息将正确显示,但DTO情况会发生变化。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。