如何在Spring MVC中将JSON负载发布到@RequestParam?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (270)

我使用的是Spring Boot(最新版本,1.3.6),我想创建一个REST端点,它接受一堆参数和一个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参数设置为String并在控制器方法内解析负载,但是这种做法违背了使用Spring MVC的观点。

如果我使用它,这一切都有效@RequestBody,但是我放弃了在JSON主体之外单独发布参数的可能性。

Spring MVC中有一种方法来“混合”普通的POST参数和JSON对象吗?

提问于
用户回答回答于

是的,可以通过post方法发送params和body:服务器端示例:

@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"}'
用户回答回答于

你可以通过注册一个做到这一点ConverterString使用自动连线到你的参数类型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);
        }
    }
}

扫码关注云+社区

领取腾讯云代金券