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

如何避免因为@Constraint ValidatedBy而导致层间的交叉依赖?

白昊乾
2023-03-14

是否有一种方法(使用标准的JSR303 api)在运行时指定某种自定义约束的验证器类(或以任何其他方式解决我们的问题)?内置的约束具有空的validatedBy属性,但我不知道是否有相应的api。

共有1个答案

莘昊
2023-03-14

我们在基于Spring的项目中也面临同样的问题。为了以最好的Spring方式解决这个问题,我们将ConstraintValidator接口和实现分开。例如,在域层,我们只有接口:

public interface UniqueValidator extends ConstraintValidator<Unique, String> {
}

在服务层,我们实现该接口:

public class UniqueValidatorJpaImpl implements UniqueValidator {
    private EntityManager entityManager;
    ...
}

接下来,我们在Spring上下文中为UniqueValidatorJPaImpl声明一个bean。

public class SpringConstraintValidatorFactoryEx implements ConstraintValidatorFactory {

    private final Logger logger = LoggerFactory.getLogger(SpringConstraintValidatorFactoryEx.class);

    @Autowired
    private AutowireCapableBeanFactory beanFactory;

    public <T extends ConstraintValidator<?, ?>> T getInstance(Class<T> key) {
        T bean = null;

        try {
            logger.info("Trying to find a validator bean of class " + key.getSimpleName());
            bean = this.beanFactory.getBean(key);
        } catch (BeansException exc) {
            logger.info("Failed to find a bean of class " + key.getSimpleName());
        }

        if (bean == null) {
            try {
                logger.info("Creating a new validator bean of class " + key.getSimpleName());
                bean = this.beanFactory.createBean(key);
            } catch (BeansException exc) {
                logger.info("Failed to create a validator of class " + key.getSimpleName());
            }
        }

        if (bean == null) {
            logger.warn("Failed to get validator of class " + key.getSimpleName());
        }

        return bean;
    }

}
 类似资料:
  • 问题内容: 在我们的项目中,我们在单独的Maven模块中具有Service和DAO层。服务模块取决于DAO模块,并与它的实体一起使用。问题在于我们不能在DAO实体中放置使用服务层中某些服务的定制jsr 303约束,因为这会创建从DAO层到服务层的反向引用,因为验证器类需要在custom的validatedBy属性中进行引用@约束。 有没有办法(使用标准jsr 303 api)在运行时指定一些自定义

  • 你好,我有一个基于spring boot的后端,我们正在使用自己的库将JPA实体转换为DTO的(库基于反射工作)。问题是,我们将服务层直接注入到一些映射器中。假设我有一个和。UserDto有一个名为avatar的字段,化身存储在中。因此,为了构建UserDto,我们使用如下代码。 我不喜欢这种方法,因为Mapper必须对服务层一无所知。但是,这个映射器也被其他映射器使用。如果我想返回一个Order

  • 考虑这两个模块(在同一个文件夹中): 首先是人。派克 然后pet.py 上面的代码将无法工作,因为循环依赖。你会得到一个错误: 让它工作的一些方法: 将类Person和Pet的定义保存在同一个文件中 e、 g.只要有: 到目前为止,我在列出的所有选项中看到了一些缺点。 还有别的办法吗?一个允许我 将类拆分为不同的文件 或者:有没有很好的理由去遵循我已经列出的解决方案之一?

  • 如果我正在创建一个带有如下头文件的静态库: 在我自己的项目中,我可以告诉编译器(在我的例子中是Visual Studio)在哪里查找SomeHeaderFile.h。但是,我不希望我的用户关心这一点--他们应该能够包含我的头,而不必通知编译器SomeHeaderFile.h的位置。 这类情况通常如何处理?

  • 我有一个浏览器应用程序,动态显示内容,可以短或长于可用的屏幕大小。在桌面浏览器上,这会导致垂直滚动条出现/消失,从而使内容左右“跳转”。 为了避免这种情况,我将添加到标记中,这将强制滚动条始终显示--如果内容比屏幕短,滚动条将被禁用。 当我使用组件显示滑动选项菜单时,问题就出现了。在浏览器检查器中查看DOM,似乎在显示菜单时主动删除标记上的我的样式,但在删除菜单时不会将其放回原处。 在Netlif

  • 问题内容: 我知道python中的循环导入问题已经出现过很多次了,我已经阅读了这些讨论。在这些讨论中反复提出的意见是,循环导入表明设计不良,应重新组织代码以避免循环导入。 有人可以告诉我在这种情况下如何避免循环导入吗?:我有两个类,并且我希望每个类都有一个构造函数(方法),该构造函数接受另一个类的实例并返回该类的实例。 更具体地说,一类是可变的,一类是不变的。哈希,比较等需要不可变的类。可变类也需