2016-12-12 16 views
0

私は現在、プロジェクトを3つの部分に展開しています:US &インドで使用されるコアプロジェクト、両方に適用できる機能、米国の機能のみの米国プロジェクト、インドインドの機能だけを持つプロジェクト。休憩サービスで休憩サービスの入力パラメータが変更されました

しかし、今私は春のブートで問題が発生します。米国では、元のコアエンティティに2つの新しいフィールドが追加されているため、入力オブジェクトがPromSeckillRequestからUsPromSeckillRequestに変更されました。

今、私は自分のseckillインターフェイスをオーバーライドしたいと思います。私が望むもう一つのseckillインターフェースを書いてください。以下のコード:

@RestController("usShoppingController") 
@RequestMapping(value = "/prom", method = RequestMethod.POST) 
public class UsPromShoppingController extends PromShoppingController { 

@RequestMapping("/seckillAbandon") 
@Override 
public JsonResponse seckill(@Valid @RequestBody PromSeckillRequest request) { 
    return null; 
} 

@RequestMapping("/seckill") 
public JsonResponse usSeckill(@Valid @RequestBody UsPromSeckillRequest request) { 
     return super.seckill(request); 
    } 
} 

しかし、私の目標は、以下のどのようなものであるか:

@RestController("usPromShoppingController") 
@RequestMapping(value = "/prom", method = RequestMethod.POST) 
public class UsPromShoppingController extends PromotionShoppingController { 

@RequestMapping("/seckill") 
@Override 
public JsonResponse usSeckill(@Valid @RequestBody UsPromSeckillRequest request) { 
     return super.seckill(request); 
    } 
} 

何か良い解決はこのためにありますか? 私は春のブーツを使用しています。

EDIT:

私はグーグルでチェックし、それが今まで春のブートのための弱点だ、ということを発見しました。なぜ私は春のブーツがこの点について完全なサポートをしていないのか分かりません。おそらく私たちはこれだけのようにすることができると思います。

これを解決するためにラッパーを追加したいと思いますが、リクエストをHashMap型またはString型に変更できるようですが、これは入力要求パラメータを有効にするのが難しいためです。私は私があなたの問題がある正確に何を推測しようとすると

私はあなたが何らかの形で(例えば、プロファイルを使用して)と仮定していまず:-)それを修正する方法を持っているものの情報から

+0

正直言って私はあなたの問題が何かを知りません。あなたが他の投稿を参照している場合は、関連するコードを含めてください。 –

+0

@ ChristophGrimmer-Dietrich入力パラメータエンティティが変更されたとき、どのようにあなたの残りのコントローラを無効にしますか? – CharlieShi

+0

両方のコントローラが異なるエンドポイントをリッスンしますか? –

答えて

3

[OK]を、トグル2つのコントローラーを同じエンドポイントにバインドすることができないため、どのコントローラーがアクティブになっていますか。これは本当に春のせいではありませんが、アプリケーションサーバー(例えば、tomcat)内のルーティングと関係しています。

Soooo ...プロファイルを使用している場合は、コントローラークラスに@Profileと注釈を付けて、どちらを使用するかを切り替えるだけで、アクティブなプロファイルを修飾子として使用できます。そうすれば、何も無視する必要はありません。

さらに、構成の代わりに継承を削除することを強くお勧めします。すべての共有ロジックを(あなたが継承したもののような)中央クラスに入れ、コンストラクタに注入します。

あなたは春ブーツの一部の古いバージョンを使用している場合はあなたのコードは、このようになりますあなたは @RequiredArgsConstructorにonMethod注釈を追加したり、それを記述する必要があり

@RestController 
@PostMapping("/prom") 
@Profile("us") 
@RequiredArgsConstructor 
public class UsShoppingController { 

    private final ShoppingController helper; 

    @RequestMapping("/seckill") 
    public JsonResponse seckill(@Valid @RequestBody UsPromSeckillRequest request) { 
     return helper.seckill(request); 
    } 
} 

(私は上にいくつかのロンボク島の砂糖を追加しました)

手で。

同時に2つのコントローラを同時に実行する必要がある場合は、パラメータタイプに基づいたルーティングを行うアプリケーションコード内に間接レイヤを追加する必要があります。アプリケーションサーバーはそこであなたを助けることはできません。

関連する問題