当前位置: 首页 > 知识库问答 >
问题:

为什么验证不对DTO类型的对象起作用,而只对实体起作用

赏逸春
2023-03-14

我在dto类型的对象上设置了一个注释集,与在实体类型的对象上设置的注释集相同。注释对实体起作用,但对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;
    }

}
@Size(message = "{validate.packageid.size}", max = 36)
private String documentId
@Column(name = "DOCUMENTID")
@Size(message = "{validate.packageid.size}", max = 36)
private String documentId;
public static  <S> S fillData (S object, List<Object> values){
    return obtainMetadataOfObject(object, values);
}

我需要能够获得在dto对象的字段上设置的约束注释,或者更确切地说是它的参数(但是在dto对象的情况下,我获得null,因为Spring可能不知道如何使用在dto对象的字段上设置的约束注释),在实体的情况下-事实证明,但是实体验证器是由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();

        }

共有1个答案

闻昊英
2023-03-14

验证需要在某个地方触发,对于实体,在您的情况下是由spring框架(或者jpa)执行的。DTO永远不会到达那里。因此,您必须根据文档自行触发验证(validator.validate)。这里有一个相关的问题,询问在哪个应用程序层做这件事。

 类似资料:
  • 我创建了一个新的反序列化器,以便能够将空字符串写入为null 尝试在每个用户字段上做一个注释,自定义工作,但通过在整个类上插入注释,我不能再打印Json消息 CustomExceptionHandler向我抛出以下错误:Class MethodArgumentNotValidException这是我的Kafka使用者,我唯一输入验证注释的使用者,但即使删除它也会出现同样的错误 对象映射器 有没有可

  • 所以我有了这个网格: 在中有一个没有空格的超长字符串。是具有固定尺寸的占位符。这就产生了上述结果: 但将更改为会得到以下结果: 它会溢出其父级和屏幕大小。为什么它的行为不像Minmax? 码本

  • 问题内容: 我在这里有点困惑。如果我将变量传递给json_decode,它将不起作用: 第一个回显正确显示了我传递的JSON字符串,例如 第二个回显显示NULL。因此,我从第一个回显中获取了字符串,并编写了以下代码: 你怎么说,它向我展示了正确解码的数组。字符串绝对相同,我什至保留转义字符。也许是问题所在? 问题答案: 看起来您的服务器已启用。无论是将其禁用或运行通过使用它之前。

  • 问题内容: 我有几列使用flex给出相等的宽度。每个都包含标签,我希望这些图像显示尺寸。 如本演示中所示,图像没有调整大小。这是为什么? 问题答案: 从规格: 该属性指定如何将替换元素的内容装配到通过其使用的高度和宽度建立的框中。 关键术语是: 根据其使用的高度和宽度安装到盒子中 图像将被替换,而不是其容器。并且由其使用的高度和宽度确定的框与图像本身有关,而不与容器有关。 因此,报废容器并使图像本

  • 问题内容: 我对Python 3中的和类有些困惑。也许有人可以消除我的困惑或提供一些其他信息。 我目前的理解是,每个类(除外)都从称为的基类继承。但是每个类(包括)也是该类的一个实例,它是自身的实例,并且也从继承。 我的问题是: 是否有一个原因/设计决策,为什么是的实例并从中继承?对象的/ class是否也可以是对象本身? 类()如何成为其自身的实例? 哪一个是真正的基类或? 我一直认为这将是最“

  • 我正在实现一个带有表单验证的示例Spring MVC表单。我有一个复杂类型作为表单bean的bean属性。并且我为bean属性添加了表单验证。但在UI中并没有体现出同样的情况。但是表单验证也适用于表单bean的其他基元类型。 因此,验证对于表单bean非常有效,但对于嵌套的复杂类型(如表单bean中的)则不适用。 我正在试着了解原因和解决办法。 Spring版本4.0+。Hibernate验证器A