5

Spring mvc (3.1.1) アプリがあり、RequestMapping で利用できる条件を超えて条件を定義したいと考えています。使いたいことがいくつかあります。

まず、ユーザー タイプごとに異なるホームページを表示できるとよいでしょう。

@Controller
public class HomepageController {

    @RequestMapping(value = "/")
    @CustomCondition(roles = Guest.class)
    public String guestHome() { /*...*/ }

    @RequestMapping(value = "/")
    @CustomCondition(roles = Admin.class)
    public String adminHome() { /*...*/ }

}

次に、アプリを Web サイトと REST サービス (モバイル アプリなど) の両方として機能させたいので、Web サイトが html アクションと json アクションの両方にアクセスできるようにし、サービス (別のサブドメイン) のみにアクセスできるようにします。 json アクションへのアクセス ( @CustomCondition(web = true)Web サイトの URL のみに一致するもの)

これは、私が計画している 2 つの用途のいずれにも使用できますか?

カスタム条件に関するドキュメントはほとんど見つかりませんでしたが、カスタム条件を実装する例が 1 つ見つかりました。クラスへのSpring xml定義全体。@Configuration@Configuration

XMLで customMethodCondition を定義できRequestMappingHandlerMappingますか?

カスタムを返すためにサブクラス化RequestMappingHandlerMappingとオーバーライドを試みましたが、うまくいきませんでした -私の状態では発火しませんでした。getCustomMethodConditionRequestConditiongetMatchingCondition()

どんな助けでも大歓迎です!

アップデート

もう少し読んだところRequestMappingHandlerMapping、新しいクラスのようです (ver 3.1 以降)。

私のアプリで何が起こるかは、Bean をオーバーライドして再定義しようとする @Configuration がrequestMappingHandlerMapping実際に機能することですが、URL マッピング ( s@RequestMapping内のメソッド) は、サブクラスによって1 回、元の--firstによって 1回、2 回処理されるようです。カスタム条件、およびそれなしで再び。@ControllerExtendedRequestMappingHandlerMappingRequestMappingHandlerMapping

要するに、私のカスタム条件は単に無視されるということです。

これは高度なパターンであるはずですが、IMO ではかなり一般的なはずです...

誰かコメントしますか?

4

2 に答える 2

3

Spring MVC は、json と html を区別するためのメカニズムをすでに提供しています。RequestMapping アノテーションは、リクエストのコンテンツ タイプを参照する consumer 属性を取ります...

// REST version, Content-type is "application/json"
@RequestMapping(value = "/", consumes = "application/json")
public void myRestService() {
...

// HTML version, Content-type is not "application/json"
@RequestMapping(value = "/", consumes = "!application/json")
public void myHtmlService() {
...

同じ URL を使用するが異なるメソッドを持つ別の方法は、param または headers 属性を使用することです...

// the url is /?role=guest
@RequestMapping(value = "/", param = "role=guest")
public void guestService() {

// the url is / with header role=admin
@RequestMapping(value = "/", headers = "role=admin")
public void adminService() {

セキュリティのために個別の URL が必要になると思います。通常、Spring Security のようなものでは、すべての管理機能を /admin の下に置き、フレームワークにすべてを管理させます...

<http auto-config="true">
  <intercept-url pattern="/admin/**" access="ROLE_ADMIN" />
...

あなたのユースケースにはこれで十分ですか?

于 2012-06-06T20:27:48.213 に答える
1

RequestMappingHandlerMapping(たとえばExtendedRequestMappingHandlerMapping)を拡張した場合は、この新しいマッピングをアプリケーションコンテキストxmlで少し異なる方法で登録する必要があります。

Spring MVCを内部で独自のhandlerMappingを定義するように構成するために使用することはできません<mvc:annotation-driven/>。代わりに、これらの線に沿って何かを行うことができます(または、@Configuration提供したリンクのアプローチに従う)。

<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>
        </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="..ExtendedRequestMappingHandlerMapping">
</bean>

handler methodこれにより、マッピングが有効になり、コンポーネントによって適切なものが確実に検出されるようになりhandlerAdapterます。

于 2012-06-06T21:19:45.337 に答える