web-dev-qa-db-ja.com

Spring:POST body?からパラメーターを取得する方法は?

ポストリクエストの本文からパラメータを取得する必要があるスプリングを使用したWebサービス?本文の内容は次のようになります:-

source=”mysource”

&json=
{
    "items": [
        {
            "username": "test1",
            "allowed": true
        },
        {
            "username": "test2",
            "allowed": false
        }
    ]
}

そして、ウェブサービスの方法は次のようになります:

@RequestMapping(value = "/saveData", headers="Content-Type=application/json", method = RequestMethod.POST)
    @ResponseBody
    public ResponseEntity<Boolean> saveData(@RequestBody String a) throws MyException {
        return new ResponseEntity<Boolean>(uiRequestProcessor.saveData(a),HttpStatus.OK);

    }

本文からパラメータを取得する方法を教えてください。私は文字列全体を取得できますが、それが有効なアプローチだとは思いません。さらに進めるにはどうすればよいか教えてください。

17
Harinder

リクエストからパラメータを取得できます。

@ResponseBody
public ResponseEntity<Boolean> saveData(HttpServletRequest request,
            HttpServletResponse response, Model model){
   String jsonString = request.getParameter("json");
}
18
Jason

投稿本文全体をPOJOに入れることができます。以下は似たようなものです

@RequestMapping(value = { "/api/pojo/edit" }, method = RequestMethod.POST, produces = "application/json", consumes = "application/json")
@ResponseBody
public Boolean editWinner( @RequestBody Pojo pojo) { 

Pojoの各フィールド(ゲッター/セッターを含む)は、コントローラーが受信するJson要求オブジェクトと一致する必要があります。

12
alowsarwar

MappingJacksonHttpMessageConverterを使用してjsonをPOJOにバインドできます。したがって、コントローラーの署名は次のようになります。

  public ResponseEntity<Boolean> saveData(@RequestBody RequestDTO req) 

RequestDTOは、ジャクソンのシリアライズ/デシリアライズで動作するように適切に注釈が付けられたBeanである必要があります。 * -servlet.xmlファイルには、次のようにRequestMappingHandlerに登録されているJacksonメッセージコンバーターが必要です。

  <list >
    <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>

  </list>
</property>
</bean>
7
redzedi

クラスではこんな感じ

@RequestMapping(value = "/saveData", method = RequestMethod.POST)
 @ResponseBody
    public ResponseEntity<Boolean> saveData(HttpServletResponse response,Bean beanName) throws MyException {
        return new ResponseEntity<Boolean>(uiRequestProcessor.saveData(a),HttpStatus.OK);

}

ページでは次のようにします:

<form enctype="multipart/form-data" action="<%=request.getContextPath()%>/saveData" method="post" name="saveForm" id="saveForm">
<input type="text" value="${beanName.userName }" id="username" name="userName" />

</from>
2

これらのインポートが必要になります...

import javax.servlet.*;
import javax.servlet.http.*;

また、Mavenを使用している場合は、プロジェクトのベースディレクトリにあるpom.xmlファイルの依存関係ブロックでもこれが必要になります。

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.0.1</version>
    <scope>provided</scope>
</dependency>

次に、Jasonによる上記の修正が機能します。

@ResponseBody
    public ResponseEntity<Boolean> saveData(HttpServletRequest request,
        HttpServletResponse response, Model model){
        String jsonString = request.getParameter("json");
    }
1
HoldOffHunger

@RequestBodyParamを使用して試すことができます

@RequestMapping(value = "/saveData", headers="Content-Type=application/json", method = RequestMethod.POST)
@ResponseBody
public ResponseEntity<Boolean> saveData(@RequestBodyParam String source,@RequestBodyParam JsonDto json) throws MyException {
    ...
}

https://github.com/LambdaExpression/RequestBodyParam

1