【问题标题】:How to Inject Spring values to Hibernate Type Definition class如何将 Spring 值注入 Hibernate 类型定义类
【发布时间】:2014-05-23 00:37:31
【问题描述】:

这是一个 Spring Hibernate 实现。我已经定义了一个自定义类型定义,我需要在其中传递

我的自定义类型定义类的一个默认值如下。

但是值是 null 请帮我看看我在这里缺少什么?

@TypeDef(name = "customString", typeClass = com.mydomain.EncryptString.class)
public class employee{

    private String empId;
    private String empName;
    @Type(type="customString")
    private String passportNumber;

      //setter and getters 
}


public class EncryptString mplements UserType{
    private String password; // inject via spring configurations

    @Override
    public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException {

        String encryptedPassport = rs.getString(names[0]);

        System.out.println(names.length);

        System.out.println("##"+password); // This null ????

        return ""
    }

    //password getters and setters methods

}

弹簧配置

<bean id="customString"
    class="com.mydomain.EncryptString">     
    <property name="password" value="password" />
</bean>

nullSafeGet() 方法中的密码密码值,它打印 Null。制作方法

注入?我希望 Spring 将加载所有给定的默认值并实例化值

当 EncryptString 类通过 Hibernate 注解调用时。

用调查结果更新我的问题

我看到了一个示例,其中 TypeDef 将 spring bean id 作为参数传递,如下所示。

   @TypeDef(name = "encryptedString", typeClass =     
   org.jasypt.hibernate.type.EncryptedStringType.class, parameters = { @Parameter(name 
   = "encryptorRegisteredName", value = "hibernateStringEncryptor") })

弹簧配置是

 <bean id="hibernateStringEncryptor"
    class="org.jasypt.hibernate.encryptor.HibernatePBEStringEncryptor">
    <property name="registeredName" value="hibernateStringEncryptor" />
    <property name="password" value="password" />

    <property name="saltGenerator">         
        <bean class="org.jasypt.salt.FixedStringSaltGenerator">
            <property name="salt" value="salt"/>
        </bean>         
    </property>

hibernateStringEncryptor 配置是通过类型 def 注入的,将 bean id 作为

参数。我浏览了代码http://www.jasypt.org/download.html,但想不通

bean 被注入的方式。

【问题讨论】:

  • 你到底想做什么,你需要注入 EncryptString 吗?可能有更好的方法来完成您想做的事情,但是您的示例并不能很好地表达您的意图
  • 这只是一个假设的业务场景。请只考虑技术要求。

标签: java spring hibernate


【解决方案1】:

我认为您需要使用 @Configurable 注释,因为 Spring 不会实例化自定义类型,Hibernate 会,而 Spring 不知道这些实例。这是描述场景的section in the documentation。我自己没有使用过这种方法,但@Configurable 将是我尝试的第一件事。

基本上,您需要使用@Configurable 注释您的EncryptString 类,将spring-aspect.jar 添加到项目的类路径中,将&lt;context:spring-configured/&gt; 添加到您的xml 配置文件中并启用AspectJ 编织。文档对此提供了相当多的详细信息。

【讨论】:

  • 谢谢。请在使用结果标题更新我的问题后参考票证。有没有办法将 bean id 传递给 Type def 参数并注入它。这是有效的。当反编译 jasypt jar 无法弄清楚这种情况发生的方式。但它正在工作。
  • 您在其中添加的内容与您最初询问的内容不同。您正在使用一个新框架。
  • 我查看了代码,但我认为它们实际上并没有进行注入:HibernatePBEStringEncryptor 的字段由注入填充,但 EncryptedStringType 发生的情况不是 Spring 注入。
  • this code 中,当从 Spring 调用 setRegisteredName() 时(在 xml 配置文件中)创建了 HibernatePBEEncryptorRegistry 的 SINGLETON 实例,并且 Spring 创建的实例在该单例注册表中“注册”。
  • 如果你在 nullSafeGetnullSafeSet 被调用时查看 EncryptedStringType ,则检查相同的单例 HibernatePBEEncryptorRegistry 并使用较早注册(未注入)的加密器 - HibernatePBEStringEncryptor - Spring创建的加密器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-12
  • 1970-01-01
  • 2010-10-11
  • 1970-01-01
  • 2017-07-30
  • 2014-08-07
  • 1970-01-01
相关资源
最近更新 更多