0

私はSpringが初めてで、sessionFactoryを注入したいのですが、まったく機能しません。Web サーバーの Jetty を起動してから、コンテキストを読み込みます。GWT Web アプリケーションを起動した後、サーバー側で呼び出しを行い、情報を取得しようとしましたが、null ポインターを取得しました。エラーがまったくないので、どこに問題があるのか​​ を知るのが難しくなります。以前に取り組んだプロジェクトで動作しているのを見たので、うまくいくと思います。どんな助けでも感謝します。(私のおそらく悪い英語で申し訳ありません)

context.xml は次のとおりです。

 <?xml version="1.0" encoding="UTF-8" ?>

 <beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:context="http://www.springframework.org/schema/context"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:tx="http://www.springframework.org/schema/tx"
   xmlns:aop="http://www.springframework.org/schema/aop"
   xmlns:security="http://www.springframework.org/schema/security"
   xsi:schemaLocation="http://www.springframework.org/schema/beans       
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
   http://www.springframework.org/schema/context http://www.springframework.org/schema
    /context/spring-context-3.0.xsd
   http://www.springframework.org/schema/tx http://www.springframework.org/schema
    /tx/spring-tx-3.0.xsd
   http://www.springframework.org/schema/aop http://www.springframework.org/schema
    /aop/spring-aop-3.0.xsd
   http://www.springframework.org/schema/security http://www.springframework.org/schema
    /security/spring-security-3.0.xsd">


   <!--  Standard spring initialization -->
   <context:component-scan base-package="com.test">

   </context:component-scan>

   <tx:annotation-driven transaction-manager="txManager"/>

   <!-- Connection to the database-->
   <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-
    method="close">

   <property name="driverClassName" value="com.mysql.jdbc.Driver" />
   <property name="url" value="jdbc:mysql://localhost:3306/test" />
   <property name="username" value="root" />
   <property name="password" value="123456789" />
   </bean>

   <!-- Hibernate session factory-->
   <bean id="jpaSessionFactory"   
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
  <property name="dataSource" ref="dataSource" />
  <property name="packagesToScan" value="com.domain"/>
  <property name="namingStrategy" >
    <bean class="org.hibernate.cfg.ImprovedNamingStrategy" />
  </property>
  <property name="hibernateProperties">
    <props>
        <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
        <prop key="show_sql">true</prop>
        <prop key="hibernate.hbm2ddl.auto">update</prop>
    </props>
  </property>
   </bean>

   <!-- Hibernate session factory -->   
   <bean id="txManager"    
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <property name="sessionFactory" ref="jpaSessionFactory" />
   </bean>

 </beans>

ここにメインがあります:

    public static void main(String[] args) {

        ContextHandlerCollection contexts = new ContextHandlerCollection();

        contexts.setHandlers(new Handler[] 
        { new AppContextBuilder().buildWebAppContext()});

        final JettyServer jettyServer = new JettyServer();
        jettyServer.setHandler(contexts);
        Runnable runner = new Runnable() {
            @Override
            public void run() {
                new ServerRunner(jettyServer);
            }
        };
        EventQueue.invokeLater(runner);

        new ClassPathXmlApplicationContext("context.xml");
    }

インジェクションが必要なクラス Test は次のとおりです。

@Component("test")
public class TEST{

    @Resource(name="jpaSessionFactory")
    private SessionFactory sessionFactory;

    @SuppressWarnings("unchecked")
    @Transactional(readOnly = true)
    public  List<Personne> getPersonnes() {

        Session s = sessionFactory.getCurrentSession();

        Query query = s.createQuery("from Person");

        return query.list();
    }
}

これはアプリケーションのサーバー側です (完全には示されていません)。

/*** The server side implementation of the RPC service.
 */
@SuppressWarnings("serial")
public class GreetingServiceImpl extends RemoteServiceServlet implements
    GreetingService {

@Resource
private TEST t;

public String greetServer(String input) throws IllegalArgumentException {
    // Verify that the input is valid. 
    if (!FieldVerifier.isValidName(input)) {
        // If the input is not valid, throw an IllegalArgumentException 
                        back to
        // the client.
        throw new IllegalArgumentException(
                "Name must be at least 4 characters long");
    }

    t.getPersons();  // NULL pointer here

...................................

MySQL テーブルは正常に作成されているため、すべてのスキャンが機能しているように見えます。

ありがとう

ボブ

4

1 に答える 1

1

これは、GreetingServiceImpl クラスが spring によって作成されたものではないためです。コンテナーによって直接初期化されるのはサーブレットです。この記事の指示に従って問題を解決してください。関連するコードを記事からコピーしました。

@Override
public void init() throws ServletException {
    super.init();

    final WebApplicationContext ctx =
        WebApplicationContextUtils.getWebApplicationContext(getServletContext());

    if (ctx == null) {
        throw new IllegalStateException("No Spring web application context found");
    }

    ctx.getAutowireCapableBeanFactory().autowireBeanProperties(this,
        AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, true);
}
于 2012-05-10T05:31:36.223 に答える