Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么验证不适用于DTO类型的对象,而只适用于实体_Java_Hibernate_Spring Boot_Bean Validation - Fatal编程技术网

Java 为什么验证不适用于DTO类型的对象,而只适用于实体

Java 为什么验证不适用于DTO类型的对象,而只适用于实体,java,hibernate,spring-boot,bean-validation,Java,Hibernate,Spring Boot,Bean Validation,我在类型为dto的对象上设置了注释集,与类型为Entity的对象上的注释集相同。注释适用于实体,但不适用于dto类型的对象 我在SpringBoot工作。 应用程序属性 validate.packageid.size = "The field 'PACKAGEID' can contain only {max} symbols."; 配置文件 @配置 公共类ServiceConfig实现WebMVCConfiguer{ @豆子 public MessageSource MessageSourc

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

我在SpringBoot工作。 应用程序属性

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

@配置
公共类ServiceConfig实现WebMVCConfiguer{
@豆子
public MessageSource MessageSource(){
ResourceBundleMessageSource=新ResourceBundleMessageSource();
source.setDefaultEncoding(“UTF-8”);
setBasename(“类路径:ValidationMessages”);
返回源;
}
@可空
@凌驾
公共验证器getValidator(){
LocalValidatorFactoryBean validator=新的LocalValidatorFactoryBean();
setValidationMessageSource(messageSource());
返回验证器;
}
}
dto

@Size(message=“{validate.packageid.Size}”,max=36)
私有字符串documentId
实体

@列(name=“DOCUMENTID”)
@大小(消息=“{validate.packageid.Size}”,最大值=36)
私有字符串documentId;
我无法使用注释@Valid,因为我用反射技术填充了dto类型的对象

publicstaticfilldata(S对象,列表值){
返回获取的对象元数据(对象、值);
}
我需要能够在dto对象的字段上设置约束注释,或者更确切地说是它的参数(但在dto对象的情况下,我得到null,因为Spring可能不知道如何使用在dto对象字段上设置的约束注释),在实体的情况下,结果是,但是实体验证器由Spritg参与,因为它将实体作为应用程序上下文中的组件进行管理

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

用于验证来自的dto

更新

我把注释@Validation放在dto上,然后我得到了我需要的数据

它适用于没有继承人的类

我得到注解@Size的数据

private static int getMaxLimitSize(字段){
字段。setAccessible(true);
大小注释=field.getAnnotation(Size.class);
int零=0;
if(annotation==null)返回零;
返回annotation.max();
}
但是对于字段被分成几个类的对象来说,这个不起作用:几个抽象类和一个生成类


验证不适用于DTO类型的复合对象,非常感谢任何帮助?

验证需要在某个地方触发,对于您案例中的实体,spring框架会这样做(或者jpa)。DTO永远无法到达那里。因此,您必须自己触发验证(
validator.validate
),按照。这里有一个问题是在哪个应用程序层执行此操作

 @PostMapping("/test")
    public void test( @RequestBody @Valid final UserDto dto) {

        // logic
    }
你应该在控制器中添加@Valid注释。 如果要在服务层中验证dto,应添加@validate和@Valid:

@Service
@Validated
public class Service {

   public void test(@Valid UserDto dto){
       // logic
   }
}

你在哪里验证它?