Вопрос по hibernate, spring, java, interceptor – Автоматически подключен к спящему перехватчику

3

Я расширяю hibernate.EmptyInterceptor, и в моей реализации я хотел бы иметь автоматическое подключение к некоторым службам, но они возвращают ноль. Я добавил аннотацию @Component над классом. Мой код:


    
        
        
        
        
        
    

и класс:

@SuppressWarnings("serial")
@Component
public class AuditInterceptor extends EmptyInterceptor {

    @Autowired
    private IUserSessionService userSessionService;

Ваш Ответ

2   ответа
3

никогда оставить@Autowired цель какnull (Если не указаноnull это то, что вы вводите). Это должно сказать вам, что если@Autowired полеnullТогда Весна не имела к этому никакого отношения.

Похоже, что дело здесь. Предоставляя что-то вроде

<entry key="hibernate.ejb.interceptor" value="com.net.filter.AuditInterceptor">
</entry>

Я верю тебе'повторяет Hibernate создать этот экземпляр сам, и поэтому он выигралбыть бобом, управляемым весной.

Если вы опубликуете остальную часть определения бина, потому что я неЯ не знаю, в какой боб вы пытаетесь ввести, могут быть альтернативы.

Спасибо за вашу помощь, но я нашел решение в:stackoverflow.com/questions/19217872/... lior
я пытаюсь внедрить службу в класс, который я опубликовал. служба (IUserSessionService) является нулевой. этот сервис autowire уже работает в разных бобах. lior
@ я или яМне бы хотелось знать, какому бину принадлежат свойства, которые вы разместили выше. Этот бин вместо использования вашего бина AuditInterceptor создает свой собственный, который выигралк весне и, следовательно, победитУ него не было обработано ни одной из целей инъекции. Sotirios Delimanolis
4

что, вероятно, это будет на два года позже, но я искал ответ на ту же проблему и подумал, что это будет полезно для кого-то в будущем.

Если посмотреть на код Hibernate, Hibernate создаст экземпляр нового экземпляра перехватчика, если вы дадите имя класса, но если вы передадите ссылку на экземпляр компонента, он будет использовать это.

Так

<bean id="myInterceptor" class="com.net.filter.AuditInterceptor">
</bean>

...

<property name="jpaPropertyMap">
    <map>
        <entry key="javax.persistence.transactionType" value="JTA">
        <entry key="hibernate.current_session_context_class" value="jta">
        <entry key="hibernate.transaction.manager_lookup_class" value="com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup">
        <entry key="hibernate.connection.autocommit" value="false">
        <entry key="hibernate.ejb.interceptor">
            <ref bean="myInterceptor">
        </ref></entry>
    </entry></entry></entry></entry></map>
</property>

Теперь bean-компонент myInterceptor управляется Spring, и автоматическое подключение будет работать!

Похожие вопросы