私の目標:
http://host:port/myApp/about
という名前の jsp ページを返しますabout.jsp
http://host:port/myApp/about/log
JSONを返すサービスコールです
私のweb.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" ...>
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>classpath:log4j.xml</param-value>
</context-param>
<context-param>
<param-name>log4jExposeWebAppRoot</param-name>
<param-value>false</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<servlet>
<servlet-name>myApp</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
...
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>myApp</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
私の servlet.xml (Spring 3.0.3.RELEASE を使用):
<beans ...>
<mvc:annotation-driven />
<context:component-scan ... />
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="15728640" /> <!-- 15 MB -->
<property name="MaxInMemorySize" value="15728640" /> <!-- 15 MB -->
</bean>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="order" value="1" />
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="order" value="2" />
<property name="mediaTypes">
<map>
<entry key="json" value="application/json" />
<entry key="xml" value="application/xml" />
</map>
</property>
<property name="defaultContentType" value="application/json" />
<property name="defaultViews">
<list>
<bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
<bean class="org.springframework.web.servlet.view.xml.MarshallingView">
<constructor-arg>
<bean class="org.springframework.oxm.xstream.XStreamMarshaller" />
</constructor-arg>
</bean>
</list>
</property>
<property name="ignoreAcceptHeader" value="true" />
</bean>
</beans>
私のコントローラー:
@Controller
@RequestMapping("about")
public class AboutController {
@RequestMapping(method=GET)
public String getStats() {
return "about";
}
@RequestMapping(value="log", method=GET)
public @ResponseBody List<String> getLog() {
...
}
}
サーバー(jetty 6、servlet-api 2.5)の起動時に次のように表示されます:
INFO org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping - Mapped URL path [/about/log] onto handler [AboutController@63843ca4]
INFO org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping - Mapped URL path [/about/log.*] onto handler [AboutController@63843ca4]
INFO org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping - Mapped URL path [/about/log/] onto handler [AboutController@63843ca4]
INFO org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping - Mapped URL path [/about] onto handler [AboutController@63843ca4]
INFO org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping - Mapped URL path [/about.*] onto handler [AboutController@63843ca4]
INFO org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping - Mapped URL path [/about/] onto handler [AboutController@63843ca4]
上記の目標に対する設定の結果:
次のエラーが発生します。
WARN org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/myApp/WEB-INF/views/about.jsp] in DispatcherServlet with name 'myApp'
- 期待どおりに動作します
私がチェックした/試したこと:
WEB-INF/views/about.jsp
ある- 両方のメソッドのコントローラーにブレークポイントを設定しましたが、両方とも適切に呼び出されています。コントローラークラスを終了した後、故障が発生します
- の順序は、
InternalResourceViewResolver
意図的に最初になるように設定されています。Spring docsがこれに対して推奨していることは知っていますが、最後に入れようとすると、「about」文字列を取得して何らかの形で解釈したためと思われる空の{ }
戻り値が返されます。ContentNegotiatingViewResolver
注文の要件はありませんが、ContentNegotiatingViewResolver
必要な設定はそのままにしておく必要があります (変更がどうしても必要な場合を除く)。 - web.xml の url-pattern を に設定し
<url-pattern>/</url-pattern>
ますが、静的リソースへの参照が壊れます (これらのリソースは現在、多くのサード パーティが運用環境で使用されているため、これはオプションではありません)。 web.xml の url-pattern を に設定します
<url-pattern>/about/*</url-pattern>
が、上記の逆の結果が得られます。- 期待どおりに動作します
次のエラーが発生します。
WARN org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/myApp/about/log.json] in DispatcherServlet with name 'myApp'
興味深いことに、URL
http://host:port/myApp/about/about/log
はこの url-pattern で機能します
そのため、指定された目標を達成するために何を修正する必要があるかについて、私は少し固執しています。