2017-07-06 9 views
0

2種類のオブジェクトを消費するが単一のエンドポイントを持つサービスを作成するにはどうすればよいですか?2つの異なるタイプのオブジェクトを消費するが、単一のエンドポイントを持つサービスを作成するにはどうすればよいですか?

/helloは、クラスHello1とクラスHello2を処理できるはずのエンドポイントです...両方とも異なるパラメータを持っています。

@CrossOrigin 
@ResponseStatus(HttpStatus.OK) 
@RequestMapping(value = "/hello", method = RequestMethod.POST) 
public BaseResponseDTO geteula(@RequestBody Hello1 request) {} 

@CrossOrigin 
@ResponseStatus(HttpStatus.OK) 
@RequestMapping(value = "/hello", method = RequestMethod.POST) 
public BaseResponseDTO geteula(@RequestBody Hello2 request) {} 

上記は私が実際に必要なものですが、単一のエンドポイントである必要があります。

+0

'handleクラスHello1とクラスHello2'はどういう意味ですか? 1つのコントローラークラスと2つの異なるサービスクラスHello1とHello2を持ち、コントローラーにそれらを話すことができます –

+0

post..pleaseベリファイを更新しました。本当にひどいコードですよね。 –

答えて

0

あなたが本当にこれをしたい場合、私はあなたが、たとえば、いくつかの抽象クラスHelloからあなたHello1Hello2クラスをinhert、パラメータとしてそれを使用することができますね。また、Jackson @JsonSubTypes@JsonTypeInfo注釈のadvangeを取る必要があります。しかし、この場合、クライアントから追加のプロパティを送信して、Jacksonがインスタンス化する必要がある実装クラスを指定しないようにする必要があります。たとえば:

@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME, 
    include = JsonTypeInfo.As.PROPERTY, 
    property = "type") 
@JsonSubTypes({ 
    @JsonSubTypes.Type(value = Hello1.class, name = "hello1"), 
    @JsonSubTypes.Type(value = Hello2.class, name = "hello2") 
}) 
public abstract class Hello { 
    ... 
} 

は、その後、あなたのクラスと、このクラスを拡張:

public class Hello1 extends Hello { 
    ... 
} 

public class Hello2 extends Hello { 
    ... 
} 

そして、あなたのコントローラ:

@CrossOrigin 
@ResponseStatus(HttpStatus.OK) 
@RequestMapping(value = "/hello", method = RequestMethod.POST) 
public BaseResponseDTO geteula(@RequestBody Hello request) { 
    if (request instanceof Hello1) { 
     // some logic 
    } 
    if (request instanceof Hello2) { 
     // some logic 
    } 
    ... 
} 

この場合には、あなたのJSONは、typeプロパティを含める必要があることに注意してください定義されているようにproperty = "type"(好きな名前を付けてください):

{"type" : "hello1", .....} 
+0

リクエストオブジェクトでjavaジェネリックを使用できますか? –

+0

@LintoKA、どういう意味ですか?あなたは例を挙げることができますか? – Leffchik

0
  1. コードを書式設定する方法をご確認ください。私はあなたのためにそれをやった。
  2. @CrossOriginとは - AFAIK、Springにはそのような注釈はありません。
  3. このようにしないでください。別々のメソッドを作成してください。

何らかの理由で、あなたの人生は複雑なコードを書くことに依存している場合、あなたはあなたのメソッドのパラメータとしてHttpServletRequestを注入し、2種類のいずれかにリクエストボディを変換することができます。要求の中にあるものに基づいてボディのタイプを調べる必要があります。

編集: 私は春が、実際には、@CrossOrigin注釈を導入していることがわかります。私は#2で修正されました。

0

同じリクエスト(同じリクエストで同じルーティングパスと同じ方法を意味します)に応答する2つの方法を持つことはできません。

"hello" POSTリクエストの1つのエントリを作成し、すべてのメンバーにHello1とすべてのメンバーを含むDTOオブジェクトを加え、Hell2というメンバーにすることができます。エントリメソッドの中で、リクエストのタイプを決定するコードを記述し、それぞれ応答を行います。

+0

本当にひどいコードです。 –

+0

これは動作しますが、私もその汚れを感じます。これを処理する他の方法? サービスコールが行われたときの位置を把握していません。 –

関連する問題