@Autowired没有在Spring restful web服务中工作

时间:2015-08-06 11:34:42

标签: java spring spring-mvc

我正在使用Struts2 + Spring4 + Hibernate4开发应用程序,并提供宁静的Web服务。我在spring bean文件中配置了hibernate。对于restful Web服务,我使用<constant name="struts.action.excludePattern" value="/service/.*"/>在struts.xml中排除了url。如果我在任何动作类中访问sessionFactory对象,它可以正常工作。但是如果我在我的网络服务中访问它,它会提供NullPointerException。在google上搜索后,我发现如果我们从struts中绕过url,则不允许使用@Autowired注释来初始化对象。如何理清这件事?我在Google上搜索过但没有找到任何有用的内容。

这是我的服务:

@Path("service/account-management")
public class AccountServiceImpl implements AccountService {

    @Autowired
    private SessionFactory sessionFactory;

    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    @Override
    @POST
    @PermitAll
    @Path("/accounts")
    public Response getAllAccounts() {
        System.out.println(sessionFactory);
         Session session = this.sessionFactory.getCurrentSession();
         List<VbarAccount> personList = session.createQuery("from TEST").list();
         System.out.println(personList);
         session.close();
         return Response.status(200).build();
    }

}

这是我的bean映射

<bean id="accountService" class="com.xxx.yyy.services.impl.AccountServiceImpl">
    <property name="sessionFactory" ref="hibernate4AnnotatedSessionFactory" />
</bean>

2 个答案:

答案 0 :(得分:0)

如果从Spring获取对象,则自动装配有效,并且在从上下文获取对象之前,应将对象配置为Spring bean。要将某个类配置为Spring bean,有时只需要放置一些@Component注释并确保扫描类以进行注释。在您的情况下,@Service注释更合适

@Service
@Path("service/account-management")
public class AccountServiceImpl implements AccountService { 

applicationContext.xml你应该有

<context:component-scan base-package="com.xxx.yyy.services"/>

答案 1 :(得分:0)

这里值得注意的是,Spring 3.1 引入了 LocalSessionFactoryBuilder,它是专门为在 @Bean 方法中使用而设计的。

http://static.springsource.org/spring/docs/3.1.0.RC1/javadoc-api/org/springframework/orm/hibernate4/LocalSessionFactoryBuilder.html

在您的 XML 中,您也可以使用休眠配置:

    <property name="dataSource" ref="dataSource"/>
    <property name="hibernateProperties">
 <props>
    <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
    <prop key="hibernate.show_sql">true</prop> 
    <prop key="hibernate.hbm2ddl.auto">update</prop> 
    <prop key="hibernate.show_sql">true</prop> 
  </props>
     </property>
        <property name="yourGivenName">
    </property>
  </bean>

<bean id="transactionManager" 
            class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"/>
  </bean>

或者可以使用基于java的bean配置: @豆 公共会话工厂 sessionFactory(){ AnnotationSessionFactoryBean sessionFactoryBean = new AnnotationSessionFactoryBean(); sessionFactoryBean.setConfigLocation(new ClassPathResource("hibernate.cfg.xml")); sessionFactoryBean.afterPropertiesSet(); 返回 sessionFactoryBean.getObject(); }

然后你可以在你的 Spring bean 中使用它:

    @Autowired
        SessionFactory sessionFactory;

然后在你的方法内部:

Session session = sessionFactory.getCurrentSession();