1

私はそれについて多くの質問があることを知っています。私はたくさん読んでいますが、誰も私を助けることができません. 私を助けてくれてありがとう。

xml ですべての Bean を定義する春の方法が気に入らないので、アプリケーション コンテキストでスキャナーを使用しましたが、@Component (管理対象の Bean) のみをサカンすると思いますが、@Service と @Repository をキャッチしたくありません。 cuz 私のサービスは null です。

それはweb.xmlの春のものです

<!-- Archivo de configuraciones de Spring y JSF -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:WEB-INF/context/applicationContext*.xml</param-value>
    </context-param>

    <!-- Línea especial para la integración con un Java-based web framework (JSF) -->    
    <listener>
        <listener-lass>org.springframework.web.context.ContextLoaderListener    

それは私のapplication-context.xmlです

 <context:spring-configured/>     

    <!-- Escanear todos los componentes y beans en vez de instanciar 1 por 1 -->
    <context:component-scan base-package="paquete" />

    <mvc:annotation-driven />

     <!-- Identificar todos los beans por las anotaciones -->
    <tx:annotation-driven transaction-manager="transactionManager"/>

    <!-- Archivo de propiedades configurables (database, messages, etc) -->
    <context:property-placeholder  location="classpath*:META-INF/*.properties"/>


    <!-- Gestor de transacciones de SPRING -->
    <tx:annotation-driven transaction-manager="transactionManager"/>

    <bean class="org.springframework.orm.jpa.JpaTransactionManager"     id="transactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>

    <!-- El conversador entre nuestras entidades y las tablas de BD -->
    <bean id="entityManagerFactory"
          class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="persistenceUnit" />
        <property name="persistenceXmlLocation" value="classpath:/WEB-INF/persistence.xml" />
        <property name="dataSource" ref="dataSource" />
        <property name="loadTimeWeaver">
            <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
        </property>
        <property name="jpaVendorAdapter" ref="vendorAdapter" />
    </bean>

    <!-- Integración de Spring e Hibernate, no es obligatorio -->
    <bean id="vendorAdapter"
          class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
        <property name="databasePlatform" value="${hibernate.dialect}" />
        <property name="showSql" value="${hibernate.show_sql}" />
        <property name="generateDdl" value="true" />
    </bean>

    <!-- Formalidad de dataSource de SPRING -->
    <bean class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" id="dataSource">
        <property name="driverClassName" value="${database.driverClassName}"/>
        <property name="url" value="${database.url}"/>
        <property name="username" value="${database.username}"/>
        <property name="password" value="${database.password}"/>
        <property name="testOnBorrow" value="true"/>
        <property name="testOnReturn" value="true"/>
        <property name="testWhileIdle" value="true"/>
        <property name="timeBetweenEvictionRunsMillis" value="1800000"/>
        <property name="numTestsPerEvictionRun" value="3"/>
        <property name="minEvictableIdleTimeMillis" value="1800000"/>
    </bean>

私のパッケージ「paquete」(スペイン語のパッケージ、ペルーからの私は英語が下手でごめんなさい)には3つのサブパッケージがあるため、netbeansには「paquete.beans」、「paquete.service」、「paquete.repositorios」などの3つのパッケージが表示されます. 「paquete」パッケージのコンポーネントスキャナーで呼び出されます

私はprimefacesを使用しているので、helloJSFBeanを持っています..

 @ManagedBean
    @Scope("session")
    @Component
    public class helloPageJSFBean {

        private String nombre;
        private String nombre2;

        public String getNombre2() {
            return nombre2;
        }

        public void setNombre2(String nombre2) {
            this.nombre2 = nombre2;
        }

        @Autowired
        HelloService helloService;

        @PostConstruct
        public void init(){
            nombre="hi";
        }

        public void saludar(ActionEvent actionEvent){
            nombre2=helloService.saludar(nombre);
        }


        /* 
         *Getters and Setters
         */
        public String getNombre() {
            return nombre;
        }

        public void setNombre(String nombre) {
            this.nombre = nombre;
        }

    }

だから私は自分のhelloServiceを呼び出して...

  @Service
public class HelloServiceImpl implements HelloService{

    @Autowired
    protected HelloRepository helloRepository;

    @Override
    public String saludar(String nombre) {
        return helloRepository.saludar(nombre);
    }

}

そして私のリポジトリは

  @Repository
    public class HelloRepositoryImpl implements HelloRepository {

        @Override
        public String saludar(String nombre) {
            return "Hola "+nombre+", estás haciendo un excelente trabajo";
        }

    }

問題はNullPointerException、「saludar」メソッドで取得することです。デバッグでは、サービスが null であり、helloServiceImpl のインスタンスではないため、@Autowired が機能していないと思います。

私が受け取ったすべての助けは素晴らしいものになるでしょう。私は2週間を失いましたが、何も失いませんでした. すべてに感謝します。

4

2 に答える 2

2

さて、ファイルの場所の定義でクラスパスを使用する理由がわかりませんでした。クラスパスについて考えてみると、誰かが「classpath*:directory/file.ext」を入力すると、IDE は SRC パスでそのファイルを検索するように強制されます。その上に Java クラスが配置されます。そして、そこには(私の構成プロジェクトでは)明らかにフォルダーがないので、定義のクラスパスを削除すると機能します。

したがって、これが誰にとっても役立つ場合は、それで満足しています。そして、時間を割いて回答してくださった皆様に感謝いたします。ありがとう !!

それが私のプロジェクト構造です。私はネットビーンズに取り組んでいます。このページには、画像を投稿できないと書かれています。リンクを教えてください

http://img17.imageshack.us/img17/6338/sinttulofwk.png

そして私の設定ファイル...

Web.xml

 <!-- Archivo de configuraciones de Spring y JSF -->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>WEB-INF/context/applicationContext*.xml</param-value>
</context-param>

applicationContext.xml

...
...  
<!-- Archivo de propiedades configurables (database, messages, etc) -->
<context:property-placeholder  location="META-INF/database.properties"/>
...
...
 <!-- El conversador entre nuestras entidades y las tablas de BD -->
<bean id="entityManagerFactory"
      class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="persistenceUnit" />
    <property name="persistenceXmlLocation" value="WEB-INF/persistence.xml" />
    <property name="dataSource" ref="dataSource" />
    <property name="loadTimeWeaver">
        <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
    </property>
    <property name="jpaVendorAdapter" ref="vendorAdapter" />
</bean>

クラスパスの考えが正しいか間違っているかを誰かが教えてくれたら、感謝します。よろしく

于 2012-08-03T22:35:28.513 に答える
1

このページを読むには、次のように設定する必要があります。

   <!-- JSF and Spring are integrated -->
   <application>
     <el-resolver>
      org.springframework.web.jsf.el.SpringBeanFacesELResolver
     </el-resolver>
   </application>

faces-config.xml@ManagedProperty(value="#{name of your service}")で、代わりに を使用して Spring Bean を参照します@Autowired

于 2012-08-03T13:17:33.337 に答える