0

私は JSF、Spring、Hibernate、および Maven を使用するのが初めてです。しかし、これまでのところ、jsf ページで名と姓を受け取る単純なプロジェクトを作成しました。それをマネージド Bean に渡し、サービス層の別のモジュールの pojo に渡します。それはすべてうまくいきますが、今は休止状態をプロジェクトに実装しようとしています。サービス層の pom にいくつかの依存関係を追加し、リソース フォルダーにいくつかのファイル (db.properties、applicationContext.xml、datasource.xml、HibernateSessionFactory.xml) を作成し、簡単な小さな dao ファイルを作成しました。アーキテクチャはひどいものですが、大きなプロジェクトの設計に移る前に、簡単な例を見てみたいと思います。

Web 層のアプリケーション コンテキスト ファイルは、サービス層に接続するようにマネージド Bean をセットアップするだけです。サービス層ですべての処理とデータベースのやり取りを行いたいため、休止状態の構成はありません。また、pojo で hibernate アノテーションを使用しています。

サーバーを実行すると、自分の Web ページにアクセスし、姓名を入力して [送信] をクリックできます。デバッグすると、変数がマネージド Bean からサービス層に設定され、サービス層が customerdao オブジェクトから addCustomer を呼び出します。getHibernateTemplate().save(customer); で null ポインター例外が発生します。ライン。

WARNING: #{formBean.findBalance}: java.lang.NullPointerException
javax.faces.FacesException: #{formBean.findBalance}: java.lang.NullPointerException
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:117)
    at javax.faces.component.UICommand.broadcast(UICommand.java:315)
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:931)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)
Caused by: javax.faces.el.EvaluationException: java.lang.NullPointerException
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102)
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:101)
    ... 23 more
Caused by: java.lang.NullPointerException
    at com.scott.common.test.Customer.save(Customer.java:52)
    at com.scott.common.CustomerBackingBean.findBalance(CustomerBackingBean.java:51)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.el.parser.AstValue.invoke(AstValue.java:278)
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:274)
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
    ... 24 more

これは私の HibernateSessionFactory.xml です

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

<!-- Hibernate session factory -->
<bean id="sessionFactory" 
     class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

    <property name="dataSource">
      <ref bean="dataSource"/>
    </property>

    <property name="hibernateProperties">
       <props>
         <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
         <prop key="hibernate.show_sql">true</prop>
       </props>
    </property>

    <property name="annotatedClasses">
    <list>
        <value>com.scott.common.test.Customer</value>
    </list>
    </property> 

</bean>
</beans>

これは私のdb.propertiesです

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/scottdb
jdbc.username=djdjdi
jdbc.password=dldljdl

This is my datasource.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

 <bean 
   class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
   <property name="location">
        <value>db.properties</value>
   </property>
</bean>

  <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
  </bean>

</beans>

これは私のapplicationContext.xmlです

 <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

        <bean id="customerDao" 
             class="com.scott.common.test.CustomerDAO" >
            <property name="sessionFactory" ref="sessionFactory" />
        </bean>

</beans>

これは私のcustomerdaoクラスです

package com.scott.common.test;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;


public class CustomerDAO extends HibernateDaoSupport
{   
    public void addCustomer(Customer customer)
    {
        customer.setDescript("Test description");
        getHibernateTemplate().save(customer);
    }
}
4

2 に答える 2

0

ただの推測-customerおそらくnullです。この変更を行ってみてください。これにより、顧客オブジェクトがnullかどうかがチェックされます。

public class CustomerDAO extends HibernateDaoSupport
{   
    public void addCustomer(Customer customer)
    {
        if (customer == null ) {
            return; // do nothing if the customer is null
        }
        customer.setDescript("Test description");
        getHibernateTemplate().save(customer);
    }
}

nullのオブジェクトでメソッドを呼び出すと、NPEが取得されます。

もう1つのオプションは、より役立つ例外をスローすることです。

if (customer == null ) {
     throw new IllegalArgumentException("customer may not be null");
}
于 2012-12-14T23:41:00.343 に答える
0

別の推測-おそらくSpring Beanが適切に初期化されていません。確認してみてください:

  1. customerDAO は、Spring またはどこか明示的な new CustomerDAO() を介して作成されていますか?
  2. デバッガー sessionFactory およびその他のセッション関連のプロパティをチェックインします。

更新: コードを調べた後、推測が確認されました: Spring が正しく構成されていませんでした。2 つの Eclipse プロジェクトには、2 つの独立したアプリケーション コンテキストがあります。それを1つにマージする必要があります(これはWebアプリケーション用です)。

于 2012-12-14T23:58:55.070 に答える