2017-03-03 10 views
0

Angle 2に問題があります。@RequestParamを使用してSpring MVCに複数の属性を持つJSONをポストしていますが、オブジェクトにバインドできません。 @ModelAttributeを使用しても同じ結果が得られる別の方法があります。以下は私のサンプルコードは次のとおりです。Spring MVC(Rest)のAngular 2 httpポスト

角度2(HTTP):

this.http.post('api/codetype-create', JSON.stringify(params), { headers: new Headers({ 'Content-Type': 'application/json' }) }) 
    .toPromise() 
    .then(res => res.json().data) 
    .catch(this.handleError); 

とJSONがある次のようになります。

{ 
    "test": { 
    "ctmCode": "11", 
    "ctmMaxLevel": 11, 
    "ctmDesc": "test" 
    }, 
    "test2": { 
    "param1": "abc", 
    "param2": "abc", 
    "param3": "abc" 
    } 
} 

基本的に私は、 "テスト" を取得しにバインドしようとしていますSpring MVCの私のオブジェクトですが、nullを示しています。 以下は私の春のコントローラです:

@RestController 
@RequestMapping("/api") 
public class AppController { 
    @Autowired 
    Mdc_CodeTypeService mdcCodeTypeService; 

    @Transactional 
    @RequestMapping(value = {"/codetype-create"}, method = RequestMethod.POST) 
    public ResponseEntity<String> postCreateCodeType(ModelMap model, HttpServletRequest request, 
       @RequestParam(value="test",required=false) Mdc_CodeType test) { 
    try { 
     mdcCodeTypeService.createMdcCodeType(test); 
    } catch (Exception ex) { 
     return new ResponseEntity< String>("failed", HttpStatus.BAD_REQUEST); 
    } 
    return new ResponseEntity<String>("Success", HttpStatus.CREATED); 
    } 
} 

更新: はJSONでマッピングするためにオブジェクトラッパーを使用してレオンによって提案された別の方法があります。私は2番目の選択肢として取り上げますが、Springの注釈を使用してMdc_CodeTypeオブジェクトに "test"属性のみをマッピングすることは可能ですか?

答えて

1

@RequestBodyを使用して、要求の本体を変数にバインドする必要があります。体全体を撮影するにはオブジェクトが必要です。

CompleteRequestBodyは、リクエスト内のすべてをカプセル化する仮想クラスです。

+0

あなたの返信ありがとうございますが、このアプローチでは、新しい投稿データを処理するためにたくさんのクラスを構築する必要がありますか、これが唯一の方法ですか? –

+0

Javaは強く型付けされた言語であり、私は個人的には要求の種類ごとに具体的なクラスを持つことを推奨します。しかし、複雑さの多くを抽象化するためにジェネリックと多型を利用できることを覚えておいてください。あるいは、Object型をHashMapにしてデータにアクセスすることはできますが、データのコンパイルチェックはすべて失われます – Leon

+0

あなたの提案をお寄せいただきありがとうございます。そのような応答を処理するためにJavaクラスを使用することは私の第2の選択肢ですが、 Springアノテーションを使用してJSONの一部を抽出する方法 –