我在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/