web-dev-qa-db-ja.com

方法POST Spring MVCの@RequestParamへのJSONペイロード

私はSpring Boot(最新バージョン、1.3.6)を使用しており、多くの引数を受け入れるREST endpointを作成したいJSONオブジェクト。何かのようなもの:

curl -X POST http://localhost:8080/endpoint \
-d arg1=hello \
-d arg2=world \
-d json='{"name":"john", "lastNane":"doe"}'

私が現在やっているSpringコントローラでは:

public SomeResponseObject endpoint(
@RequestParam(value="arg1", required=true) String arg1, 
@RequestParam(value="arg2", required=true) String arg2,
@RequestParam(value="json", required=true) Person person) {

  ...
}

json引数は、Personオブジェクトにシリアル化されません。私は

400 error: the parameter json is not present.

明らかに、json引数を文字列として作成し、コントローラーメソッド内のペイロードを解析できますが、Spring MVCを使用することのポイントは無視されます。

@RequestBodyを使用すればすべて動作しますが、その後、POST JSON本体の外側の引数を個別に指定する可能性を失います。

Spring MVCにnormal POST引数とJSONオブジェクト)を「ミックス」する方法はありますか?

16
Luciano

はい、paramsとbodyの両方をpostメソッドで送信できます:サーバー側の例:

@RequestMapping(value ="test", method = RequestMethod.POST)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public Person updatePerson(@RequestParam("arg1") String arg1,
        @RequestParam("arg2") String arg2,
        @RequestBody Person input) throws IOException {
    System.out.println(arg1);
    System.out.println(arg2);
    input.setName("NewName");
    return input;
}

クライアントで:

curl -H "Content-Type:application/json; charset=utf-8"
     -X POST
     'http://localhost:8080/smartface/api/email/test?arg1=ffdfa&arg2=test2'
     -d '{"name":"me","lastName":"me last"}'

楽しい

20
Mosd

これを行うには、自動配線されたConverterを使用して、StringからObjectMapperをパラメータータイプに登録します。

import org.springframework.core.convert.converter.Converter;

@Component
public class PersonConverter implements Converter<String, Person> {

    private final ObjectMapper objectMapper;

    public PersonConverter (ObjectMapper objectMapper) {
        this.objectMapper = objectMapper;
    }

    @Override
    public Date convert(String source) {
        try {
            return objectMapper.readValue(source, Person.class);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}
6
Rich

requestEntityを使用できます。

public Person getPerson(RequestEntity<Person> requestEntity) {
    return requestEntity.getBody();
}
0
egemen