アプリケーションのコア サービスを、dispatcherservlet および @Controller アノテーションを持つクラスから分離しようとしています。ここでSOに関する多くのトピックを読みましたが、私のケースに合った例は見つかりませんでした。ルートと子の階層、コンポーネントスキャンパッケージなどに関する説明のみです。
すべての提案は、appicationContext.xml では@Controller
クラスを除くすべてのコンポーネントをスキャンする必要があり、DispatcherServlet-servlet.xml では@Controller
クラスのみをスキャンする必要があることを示しています。この@Service は 2 回作成される例と同じように行いました。
したがって、アプリケーションは正常にビルドされますが、その Web ページに移動すると、Chrome では、This link appears to be broken.
これはページが存在することを意味し、そうでない場合、Tomcat はこれを通知しますThe requested resource (/myapp) is not available.
私の設定に何か問題があるに違いありません。何が問題なのですか?これが私のapplicationContext.xml
<beans <!-- omitting namespaces for readability --> >
<!-- Scans within the base package of the application for @Components to configure as beans -->
<!-- @Controller, @Service, @Configuration, etc. -->
<context:component-scan base-package="com.myapp">
<context:exclude-filter expression="org.springframework.stereotype.Controller" type="annotation"/>
</context:component-scan>
<!-- Enables the Spring MVC @Controller programming model -->
<mvc:annotation-driven />
<mvc:resources mapping="/static/**" location="/" />
<mvc:default-servlet-handler />
<jpa:repositories base-package="com.myapp.repo" />
</beans>
次は私のweb.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app <!-- omitting namespaces for readability -->>
<display-name>My application</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:applicationContext.xml
classpath:spring-security.xml
</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<listener>
<listener-class>
org.springframework.web.context.request.RequestContextListener
</listener-class>
</listener>
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Ensure UTF-8 encoded pages so that certain characters are displayed and submitted correctly -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Enables support for DELETE and PUT request methods with web browser clients -->
<filter>
<filter-name>hiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<error-page>
<error-code>404</error-code>
<location>/WEB-INF/view/error/404.jsp</location>
</error-page>
</web-app>
以下は DispatcherServlet-servlet.xml です
<beans <!-- omitting namespaces for readability -->>
<context:component-scan base-package="com.myapp.mvc" use-default-filters="false">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
</context:component-scan>
</beans>
ここに私の構成クラスがあります
@Configuration
@ImportResource("classpath:applicationContext.xml")
@PropertySource("classpath:images.properties")
public class AppConfig implements InitializingBean {
@Inject
ServletContext context;
// Resolve logical view names to .jsp resources in the /WEB-INF/views directory
@Bean
ViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("WEB-INF/view/");
resolver.setSuffix(".jsp");
return resolver;
}
// Configure the multipart resolver
@Bean
CommonsMultipartResolver multipartResolver() {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
// multipartResolver.setMaxUploadSize(2_202_009);
return multipartResolver;
}
@Override
public void afterPropertiesSet() throws Exception {
File logoImgPreview = new File("resources/img/image_footer_logo_preview.jpg");
BufferedImage bufImgPreview = ImageIO.read(logoImgPreview);
context.setAttribute("watermark_preview", bufImgPreview);
}
}
最後に、サーバーが起動したときのログは次のとおりです。
http://pastie.org/private/z8zv7jaddytxsgbh7oggw
DispatcherServlet がコントローラー Bean を定義しているが、applicationContext が RequestMappingHandlers をマップしているというサーバー ログに表示される内容。そうであるべきか?すべてがどのように機能するか全体像についてはよくわかりませんが、これまで読んだすべてのものによると、この種のコンテキスト分離は正しいに違いありません。しかし、私の設定のどこが間違っているのでしょうか?
これは非常に基本的な私のホームコントローラーです
@Controller
public class HomeController {
private static Logger log = LoggerFactory.getLogger("com.myapp.mvc.HomeController");
@RequestMapping("/")
public String home() {
log.debug("Requesting index page");
return "index"; // it returns to index.jsp
}
}