0

注文管理モジュールを実装する効果的な方法を探しています。さまざまな注文タイプがあります (約 15 種類)。各注文には個別のビューがあります。ただし、UI で実行されるアクションは、注文の種類に関係なく同じです。以下は私のDTOの構造です

abstract class Order

abstract class SecurityOrder extends Order

abstract class TermDepositOrder extends Order
.....
.....
.....

すべてのビューを管理できる単一のコントローラーを実装しようとしています。以下のようなもの:

@Controller
public class OrderController<F extends Order> {

    public F validate(F order) {
    }

    public F insert(F order) {
    }
}

インスタンス化する注文インスタンスがわからないため、Spring mvc が要求パラメーターを注文インスタンスに適切にマップする方法がわかりません。

単一のコントローラーでこれを達成することは可能ですか、それとも注文タイプごとにコントローラーを使用して、それらすべてで同じコードを複製する必要がありますか?

4

1 に答える 1

0

カスタム メソッド プロセッサを提供することでそれを行うことができました。以下はサンプルコードです。

カスタム実装:

public class OrderControllerArgumentResolver extends 
            ModelAttributeMethodProcessor { 

    public OrderControllerArgumentResolver() { 
            super(true); 
    } 

    @Override 
    public boolean supportsParameter(MethodParameter paramMethodParameter) { 
            //Resolve - custom annotation created to differentiate order parameter from others. 
            //This is to make sure this resolver is used only while resolving OrderDTO is used as method parameter 
            if (paramMethodParameter.getParameterAnnotation(Resolve.class) != null) { 
                    return true; 
            } 
            return false; 
    } 

    @Override 
    protected final Object createAttribute(String attributeName, 
                    MethodParameter parameter, WebDataBinderFactory binderFactory, 
                    NativeWebRequest request) throws Exception { 
            //Instantiate appropriate order instance based on input. 
            return BeanUtils.instantiateClass(OrderTypeEnum.getDTOClass(request 
                            .getParameter("orderType"))); 
    } 

    @Override 
    protected void bindRequestParameters(WebDataBinder binder, 
                    NativeWebRequest request) { 
            ServletRequest servletRequest = request 
                            .getNativeRequest(ServletRequest.class); 
            ServletRequestDataBinder servletBinder = (ServletRequestDataBinder) binder; 
            servletBinder.bind(servletRequest); 
    } 
}

構成:

<mvc:annotation-driven>
    <mvc:argument-resolvers> 
            <bean 
                    class="test.util.OrderControllerArgumentResolver" /> 
    </mvc:argument-resolvers> 
</mvc:annotation-driven>

このアプローチにより、望ましい結果を達成することができました。しかし、このアプローチが他の問題を引き起こすかどうかはわかりません。提案してください。

于 2012-09-14T14:30:47.310 に答える