1

私は Spring STS (Eclipse-juno、spring 3.1 も使用) を使用しており、Spring テンプレート プロジェクトを作成しています。

アプリケーションのウェルカム ページは単純なフォームです。

  <div id="editPresPage">
     <form action="editPresPage.do" method="post"> 
    <label>Enter Page Text</label><input type="text" name="page_text"/><br>
    <input type="submit" value="Add New Page"/>
 </form>              
  </div>

フォームを配信すると、コントローラーが配置されます。

@Controller
@RequestMapping(value = "/")
public class HomeController {

    private Page_manager_service page_manager_service;

    public void setPage_manager_service(Page_manager_service page_manager_service) {
        this.page_manager_service = page_manager_service;
    }

    @RequestMapping(value="/editPresPage",method = RequestMethod.POST)
    public ModelAndView EditPresPage()    {
        page_manager_service.check();

        return new ModelAndView("thanks");      
    }

コントローラーは、My Service Layer インターフェイスからチェック メソッド (マークされている) を実行する必要があります。

public interface Page_manager_service {
    public void check();
}

サービス層の実装:

public class Page_manager_service_mock_Impl implements Page_manager_service {

    public void check() {
        System.out.println("check method was done!!!");
    }
}

しかし、チェックメソッドの実行中に次のエラーが発生します。

my.topLevel.pack.HomeController.EditPresPage(HomeController.java:64) での java.lang.NullPointerException

ここに私のservlet-context.xmlがあります:

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

    <!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->

    <!-- Enables the Spring MVC @Controller programming model -->
    <annotation-driven />

    <!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
    <resources mapping="/resources/**" location="/resources/" />

<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
    <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <beans:property name="prefix" value="/WEB-INF/views/" />
        <beans:property name="suffix" value=".jsp" />
    </beans:bean>

    <context:component-scan base-package="my.topLevel.pack" />

</beans:beans>

これが私の root-context.xml です (「page_manager_service」Bean を配線したことがわかります):

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:jee="http://www.springframework.org/schema/jee"
    xsi:schemaLocation="http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.1.xsd
        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">    

    <!-- Root Context: defines shared resources visible to all other web components -->
    <context:annotation-config/> 

    <!--  Service Beans -->    
    <bean id="page_manager_service"  class="my.topLevel.pack.Services.Page_manager_service_mock_Impl">
    </bean> 
</beans> 

web.xml ファイルは何も変更していません。

「s」があるため、サービス層の実装が注入されていることがわかります。

ビューからコントローラーにパラメーターを転送できるので、問題はありません。

これは、コントローラー <-> サービス層通信にあります。

なぜこのエラーが発生するのかわかりません..

この問題は、次の手順を実行することで解決されました。

最初のステップ: @Autowired を page_manager_service フィールドに追加します (setter を削除しても問題ありません)。

2 番目のステップ: root-context.xml ファイルの変更:

<context:annotation-config/>

に:

<context:component-scan 
    base-package="my.topLevel.pack">
</context:component-scan> 

3 番目のステップ: 削除:

<bean id="page_manager_service"       class="my.topLevel.pack.Services.Page_manager_service_mock_Impl">

root-context.xml から。

ステップ 4: @Component を Page_manager_service_mock_Impl に追加する

4

1 に答える 1

1

Beanを作成しましたが、クラスにPage_manager_service注入されていないため、呼び出し時にControllerNPE

page_manager_service.check();

で注釈Page_manager_serviceを付け@Component自動配線できますController

@Autowired
private Page_manager_service page_manager_service;

その後、セッターは不要になります...

サイドノート: Java はキャメルケースを使用しますpage_manager_service pageManagerService

于 2013-02-25T18:15:18.023 に答える