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

如何使用spring+Hibernate对多租户设置实体进行自定义验证

公孙棋
2023-03-14

我试图在使用spring Hibernate的多租户设置中使用自定义ConstraintValidator实现来验证一个实体的字段。我们如何让自定义验证器承租人知道?验证器中的实体管理器和其他autowired bean始终为空。

实体类:

@Entity
@Table(name = "autoupdate_json")
public class AutoupdateJson {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;

@Column(name="autoupdate_id")
private String autoupdateId; 

@Column(name="deployment_json", length=10000)
@ValidateAutodeploymentConfig
@Convert(converter=JpaConverterJson.class)
private ApplyInputJson deploymentJson; 
}

`验证批注:

@Documented
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {AutodeploymentConfigValidator.class})
public @interface ValidateAutodeploymentConfig {

String message() default "One or More of the Devices already have perpetual mode settings enabled. Please cancel the existing "
        + " deployment config to add a new one, Updates are not supported. ";

Class<?>[] groups() default {};

Class<? extends Payload>[] payload() default {};
}

验证器实现:

public class AutodeploymentConfigValidator
    implements ConstraintValidator<ValidateAutodeploymentConfig, ApplyInputJson> {

@PersistenceContext
EntityManager entityManager; 

@Autowired
DeviceRepository deviceRepository; 

@Override
public boolean isValid(ApplyInputJson value, ConstraintValidatorContext context) {
    List<String> deviceSerialNumbers = Arrays.asList(value.getDevices().getSerial());
    
    System.out.println("entityManager: " + entityManager);
    System.out.println("repo bean: " + deviceRepository);
}

两个sysout都为空。

共有1个答案

阎涵容
2023-03-14

实体管理器和设备存储库为空,因为AutoDeploymentConfigValidator不是来自spring上下文。它是由hibernate使用的默认约束验证工厂创建的,不使用arg构造函数。

尝试添加HibernatePropertiesCustomizer来告诉hibernate要使用哪个验证工厂。类似于:

@Component
public class HibernateCustomizer implements HibernatePropertiesCustomizer {

    private final ValidatorFactory validatorFactory;

    public HibernateCustomizer(ValidatorFactory validatorFactory) {
        this.validatorFactory = validatorFactory;
    }

    public void customize(Map<String, Object> hibernateProperties) {
        hibernateProperties.put("javax.persistence.validation.factory", validatorFactory);
    }
}

这样,您就可以在约束验证器中使用实体管理器了。

 类似资料:
  • 问题内容: 在Spring 3应用程序中,我试图通过Hibernate 4的本机MultiTenantConnectionProvider和CurrentTenantIdentifierResolver实现多租户。我看到在Hibernate 4.1.3 中存在此问题,但是我正在运行4.1.9并仍然收到类似的异常: 以下是相关代码。在I中,我现在只写了一些哑代码,每次都只返回一个新的连接,并且此时总

  • 问题内容: 在Spring 3应用程序中,我试图通过Hibernate 4的本机MultiTenantConnectionProvider和CurrentTenantIdentifierResolver实现多租户。我发现在Hibernate 4.1.3 中存在此问题,但是我正在运行4.1.9并仍收到类似的异常: 以下是相关代码。在I中,我现在只写了一些简单的代码,每次都只返回一个新的连接,并且在这

  • 我想确保在创建新用户名或更新用户名时,用户名是唯一的。我写了下面的代码,它可以很好地创建和更新用户名。但是,如果只更新其他用户字段,如年龄或性别,并保留相同的用户名,它将返回invalid,因为用户名已经存在。 重要的是,我想要的验证是使用BindingResault。我已经有一个数据库,将用户名视为唯一的限制。但是现在我想要用BindingResault进行同样的验证。但是我更新用户时的方式会导

  • 总结 如何在Django MongoEngine中使用自定义用户模型和自定义身份验证后端(允许电子邮件/密码身份验证)?(这是否需要自定义后端?…即,在使用MongoEngine进行身份验证时使用电子邮件作为用户名。) 是否有直接(完整)的文档在Django中进行身份验证时,将Mongo用作主数据存储时使用自定义用户对象的示例?(博士后有如此清晰和全面的文档…) 细节 MongoEngine似乎只

  • 我已配置Identity Server 4并使用Azure AD身份验证。如果我在身份服务器中使用租户特定的授权URL,一切都可以正常工作。这样,只有该租户的用户才能登录。我希望允许多个域登录,并希望在后端验证发行者。 为了支持这一点,我需要使用Azure AD的通用登录endpoint,在我登录后,当它重定向到Identity Server的登录endpoint时,我收到以下错误。我应该做什么配

  • 我目前正试图找出为我的系统设置多租户的最佳方法。我面临的问题是,租户并不总是必须是子域,但可以作为子域的一部分进行设置,子域可以有多个租户。我似乎在网上找不到任何东西可以帮助我在Laravel 6中进行设置。 系统要求: 一台服务器可以有许多子域 系统必须设置一个数据库,该数据库将使用tenant_id来确定哪些数据属于租户。 我目前正在以以下结构将所有子域数据存储在“subdomains”表中: