java - 为什么验证不适用于 DTO 类型的对象,而仅适用于实体

标签 java hibernate spring-boot bean-validation

我在dto类型的对象上设置了注释,与Entity类型的对象相同。该注释适用于实体,但不适用于dto类型的对象。

我在SpringBoot中工作。 application.properties

validate.packageid.size = "The field 'PACKAGEID' can contain only {max} symbols.";

配置文件

@Configuration
public class ServiceConfig implements WebMvcConfigurer {

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

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

}

dto

@Size(message = "{validate.packageid.size}", max = 36)
private String documentId

实体

@Column(name = "DOCUMENTID")
@Size(message = "{validate.packageid.size}", max = 36)
private String documentId;

我无法使用注解@Valid,因为我用反射技术填充了dto类型的对象。

public static  <S> S fillData (S object, List<Object> values){
    return obtainMetadataOfObject(object, values);
}

我需要能够获取在 dto 对象的字段上设置的约束注释,或者更确切地说是它的参数(但在 dto 对象的情况下,我得到 null,因为 Spring 可能不知道如何使用约束在 dto 对象的字段上设置的注释),在实体的情况下 - 事实证明,但实体 validator 由 Spritg 参与,因为它将实体作为应用程序上下文中的组件进行管理。

为了在 Web 客户端验证 dto,我在处理客户端请求的方法的参数中使用 @Valid 注释

用于验证 dto 来自

更新

我将注释@Validation放在dto上,之后我得到了我需要的数据。

它适用于没有类继承人的类。

我获取注释的数据@Size

    private static int getMaxLimitSize(Field field){

            field.setAccessible(true);

            Size annotation = field.getAnnotation(Size.class);

            int zero = 0;

            if(annotation == null) return zero;

            return annotation.max();

        }

但是对于字段被分为多个类的对象来说,这不起作用:几个抽象类和一个生成类。

验证不适用于DTO类型的复合对象,有任何帮助吗?

最佳答案

验证需要在某处触发,对于您的情况下的实体,Spring 框架会执行此操作(或者可能是 jpa)。 DTO 永远不会成功。因此,您必须按照 documentation 自行触发验证 (validator.validate) 。这是 related question询问在哪个应用程序层执行此操作。

关于java - 为什么验证不适用于 DTO 类型的对象,而仅适用于实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58336387/

相关文章:

Java HttpServletRequest 在浏览器 URL 栏中获取 URL

java - 为什么 Hibernate 生成一个连接错误列的查询?

java - 如何在 Spring Boot 中将特定类记录到另一个日志文件

java - 在 spring boot 中 Autowiring 时无法找到特定类型的 bean

java - 如何使用 thymeleaf 和 spring 用列表填充下拉列表

java - 如果存在注释,则将接口(interface)添加到转换后的类

java - Selenium 3.141.59 中的 ChromeDriver 问题

java - 使用 Hibernate 跨多个表生成代理键

hibernate - Jboss 7没有释放连接

java - 如何使用 dropbox api 解决 spring boot 中的多部分异常?