私は 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 に追加する