5

次のようなクラスでマルチレベルの URL を使用すると、次の例外が発生します@RequestMapping("/api/v0.1")

java.lang.IllegalStateException: Ambiguous mapping found. Cannot map 'userController'
bean method getUsers()|to {[/api/v0.1]}: There is already 'userController' bean
method getUser(java.lang.String) mapped.

メソッドレベルのマッピングがまったく考慮されていないようです。
でも、入れ@RequestMapping("/api")たり外したりしてもOK /v0.1

以下は、最小限のケースまで取り除かれた構成です。

@Controller
@RequestMapping("/api/v0.1")
public class UserController {   

    @RequestMapping(value = "/users")
    @ResponseBody
    public List<User> getUsers() {
        return null;
    }

    @RequestMapping(value = "/users/{username}")
    @ResponseBody
    public User getUser(@PathVariable String username) {
        return null;
    }
}

web.xml

<servlet-mapping>
    <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

サーブレット-context.xml:

<!-- Configures the @Controller programming model -->
<mvc:annotation-driven />

<!-- Forwards requests to the "/" resource to the "welcome" view -->
<mvc:view-controller path="/" view-name="home"/>    

<!-- Handles HTTP GET requests for /assets/** by efficiently serving up static resources in the ${webappRoot}/resources/ directory -->
<mvc:resources mapping="/assets/**" location="/assets/" />

私は春3.1を使用しています。alwaysUseFullPathプロパティを Bean の trueに設定しようとしましRequestMappingHandlerMappingたが、状況は変わりませんでした。

4

2 に答える 2

2

非常に興味深い問題 - 何が起こっているのかを確認しましorg.springframework.util.AntPathMatcherた。コントローラーからのパスとマップされたメソッドからのパスを組み合わせて完全な URI パスを作成する「v0.1」が実際にスローされているのは正しいです。@PathVariableコントローラーで「file.extension」のようなパターンが見られる場合、メソッドのパスマッピングを完全に無視します。これが、あなたが無視された理由です。

これがSpring MVCのバグなのか意図された動作なのかはわかりませんが、一時的な修正はあなたがすでに述べたことに沿っているでしょう-

1. Controller の RequestMapping から「v0.1」を外して拡張子なしにするv0_1

2.このマッピングをマップされたメソッドに配置するには:

@Controller
@RequestMapping("/api")
public class UserController {   

    @RequestMapping(value = "/v0.1/users")
    @ResponseBody
    public List<User> getUsers() {
        return null;
    }

    @RequestMapping(value = "/v0.1/users/{username}")
    @ResponseBody
    public User getUser(@PathVariable String username) {
        return null;
    }
}
于 2012-07-08T12:33:41.477 に答える