1

私の目標:

  1. http://host:port/myApp/aboutという名前の jsp ページを返しますabout.jsp
  2. http://host:port/myApp/about/logJSONを返すサービスコールです

私の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]

上記の目標に対する設定の結果:

  1. 次のエラーが発生します。

    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'  
    
  2. 期待どおりに動作します

私がチェックした/試したこと:

  • 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>が、上記の逆の結果が得られます。

    1. 期待どおりに動作します
    2. 次のエラーが発生します。

      WARN org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/myApp/about/log.json] in DispatcherServlet with name 'myApp'
      

    興味深いことに、URLhttp://host:port/myApp/about/about/log この url-pattern で機能します

そのため、指定された目標を達成するために何を修正する必要があるかについて、私は少し固執しています。

4

1 に答える 1

1

uがInternalResourceViewResolverを使用するための特別な必要性はありますか?

ジャクソンプラグインを設定するには、必要なのは

 <mvc:annotation-driven />

このXMLを試してください

<beans ...>
 <context:annotation-config />
<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 id="viewResolver"
      class="org.springframework.web.servlet.view.UrlBasedViewResolver">
    <property name="prefix" value="/WEB-INF/views/"/>
    <property name="suffix" value=".jsp"/>
</bean>
</beans>
于 2012-06-08T21:14:26.067 に答える