7

(open to another method)/**で例外を作成しながら、Spring mvc コントローラーをルート () パス (「/something」などのサブフォルダーではなく)にマップしたい。mvc:resources

これはそのフレームワークの ABC である必要がありますが、明らかに非常に複雑なものです。

Myapp-servlet.xmlには、次の明らかなマッピング例外があります。

<mvc:resources mapping="/favicon.ico" location="/favicon.ico" />
<mvc:resources mapping="/robots.txt" location="/robots.txt" />

そして、私はこのコントローラーを持っています:

import java.util.Date;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping("/**")
public class MainController {

    @RequestMapping(method = RequestMethod.GET)
    public String service(final HttpServletRequest request) {
        final String servlet_path = request.getServletPath();
        System.out.println(String.format("%s %s", new Date().toString(), servlet_path));
        return "test";
    }
}

「/」または「/test」または「/test/page」を押すと、次のような出力が得られます。

Fri Aug 03 00:22:12 IDT 2012 /
Fri Aug 03 00:22:13 IDT 2012 /favicon.ico

.. 見る?明示的に除外されている場合でもservice()呼び出されています!/favicon.ico

XMLよりも「優先度」が高いと思い@Controllerますが、除外を機能させるにはどうすればよいですか?

簡単な要件 - "/" に Web サイトがあること。

PSこの回答は、非常によく似た質問に対する回答です。

別の注意: この質問は、Tomcat のコンテキストに関するものではありません。

4

2 に答える 2

8

<mvc:annotation-driven/>書き直す代わりに、ハンドラー ディレクティブの宣言順序を変更できることを明確にしたいと思います。

<mvc:resources mapping="/favicon.ico" location="/favicon.ico" order="0"/>
<mvc:resources mapping="/robots.txt" location="/robots.txt" order="0"/>
<mvc:annotation-driven/>
于 2012-10-22T21:07:27.897 に答える
7

ここでの問題は、 に登録された基になるHandlerMapping<mvc:resources優先度が、 に登録されたものと比較して非常に低いこと<mvc:annotation-driven/>です。/**要件が単純に「/」に応答することである場合は、代わり/homeに次の行に沿って何かを定義するよりも、別の @RequestMapping を使用することをお勧めします。

<mvc:view-controller path="/" view-name="home" />

これが機能しない場合、他の唯一のオプションは、基になる handlerMapping の優先度を下げることです<mvc:resources。これは、HandlerMapping を明示的に定義することで実行できます - 少し複雑ですが実行できます。

更新され た構成は次のとおりです。

最初にこれだけで試してください:

<mvc:resources mapping="/favicon.ico" location="/favicon.ico" order="0"/>
<mvc:resources mapping="/robots.txt" location="/robots.txt" order="0"/>

これだけでは機能しない場合は<mvc:annotation-driven/>、Spring 3.1.x の次の行に沿って変更します。

<bean name="handlerAdapter" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <property name="webBindingInitializer">
        <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
            <property name="conversionService" ref="conversionService"></property>
            <property name="validator">
                <bean class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
                    <property name="providerClass" value="org.hibernate.validator.HibernateValidator"></property>
                </bean>
            </property>
        </bean>
    </property>
    <property name="messageConverters">
        <list>
            <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"></bean>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter"></bean>
            <bean class="org.springframework.http.converter.ResourceHttpMessageConverter"></bean>
            <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"></bean>
            <bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter"></bean>
            <bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"></bean>
            <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>
        </list>
    </property>
</bean>

<bean name="handlerMapping" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
    <property name="order" value="2"></property>
</bean>
于 2012-08-02T22:13:23.197 に答える