Java 为什么验证不适用于DTO类型的对象,而只适用于实体
我在类型为dto的对象上设置了注释集,与类型为Entity的对象上的注释集相同。注释适用于实体,但不适用于dto类型的对象 我在SpringBoot工作。 应用程序属性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
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
}
}
你在哪里验证它?