2

spring 3.1 では、default-url-mapping に汎用ベース コントローラーを使用する機能がありません。次の例を見てください。

<bean id="appleController" class="de.mw.mwdata.core.web.control.GenericEntityController" />
<bean id="peachController" class="de.mw.mwdata.core.web.control.GenericEntityController" />

<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" >
    <property name="alwaysUseFullPath" value="true"/>
    <property name="mappings">
      <props>
        <prop key="/admin/apple/list.htm">appleController</prop>
        <prop key="/admin/peach/list.htm">peachController</prop>
        <prop key="/admin/strawberry/list.htm">strawberryController</prop>
      </props>
    </property>
</bean> 

<mvc:annotation-driven />

<context:component-scan base-package="de.mw.mwdata.app.admin.web.control" >
</context:component-scan>

ここでは、GenericEntityController といちごコントローラーに関連するコード スニペットを示します。

    @RequestMapping("/admin/**")
public class GenericEntityController<E extends AbstractEntity> {

    ...

    @RequestMapping(value = "**/list.htm", method = RequestMethod.GET)
    public ModelAndView list( final HttpServletRequest request, final HttpServletResponse response ) {  
        ...
    }

}

package de.mw.mwdata.app.admin.web.control;
@Controller
@RequestMapping("/admin/strawberry/")
public class StrawberryController extends GenericEntityController<Strawberry> {
    ...
    }
}

したがって、Spring 3.1 の前に、SimpleUrlHandlerMapping を使用すると、コンテキストパスの Apple と Peach 用に (GenericEntityController の) 2 つのコントローラー インスタンスと、StrawberryController の 1 つの注釈付きコントローラー インスタンスがありました。/list.htm-method へのマッピングは、特にメソッドレベルで @RequestMapping によって行われました。私の質問: spring-mvc 3.1 では、注釈付きの @RequestMapping では SimpleUrlHandlerMapping が機能しなくなりました。次の例外が発生します。

Cannot map 'peachController' bean method 
public org.springframework.web.servlet.ModelAndView de.mw.mwdata.core.web.control.GenericEntityController.list(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
to {[/admin/**/list.htm],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}: There is already 'appleController' bean method
public org.springframework.web.servlet.ModelAndView de.mw.mwdata.core.web.control.GenericEntityController.list(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) mapped.

spring 3.1 でこの構成を置き換えるにはどうすればよいですか?

4

2 に答える 2

1

同じバッキング クラスを使用しているため、apple コントローラーと peach コントローラーはどちらも同じパスにマップしようとしています。コントローラーにアノテーションを使用する場合は、これら 2 つの異なるクラスを作成する必要があります。それを回避し、リンゴと桃の両方に対して同じロジックを実行する場合は、AppleAndPeachController クラスを作成し、XML で 2 つではなく 1 つの Bean のみを定義することをお勧めします。

いずれのアプローチでも、Spring は注釈付きコントローラーに基づいてハンドラー マッピングを自動的に作成するため、SimpleUrlHandlerMapping は必要なくなります。

複数のパスを同じコントローラーにマップする場合、@RequestMapping は次のように文字列の配列をパラメーターとして受け取ることができます。

@RequestMapping(value={"/admin/apple", "/admin/peach", "/admin/morefruit"})
于 2013-07-23T23:35:26.667 に答える
1

初めまして、素早い回答ありがとうございます。はい、現在、それらは両方とも同じパスに、残念ながら同じクラスにマップされています。Spring 3.1 の RequestMappingHandlerMapping により、@RequestMapping-annotations を持つすべてのコントローラーが対象になりました。それが問題です!spring 3.1 より前は、私が定義した simpleUrlHandlerMapping がその原因であり、同じパス/クラスにマップされません。代わりに、GenericEntityController の作成されたすべてのインスタンスに 1 対 1 のマッピングがありました。残念ながら、関連するコントローラーに注入された「フルーツ固有の」サービスのため、「フルーツ」ごとに GenericEntityController のコントローラーインスタンスが 1 つ必要です。では、複数の URL パスを同じ汎用ベース コントローラー クラスの異なるインスタンスにマップするにはどうすればよいでしょうか。ヒントごとにもう一度Thx...

于 2013-07-24T20:52:04.823 に答える