Spring rest json 发布空值

Posted

技术标签:

【中文标题】Spring rest json 发布空值【英文标题】:Spring rest json post null values 【发布时间】:2017-09-08 11:07:35 【问题描述】:

我有一个 Spring 休息端点做一个简单的 hello 应用程序。它应该接受一个 "name":"something" 并返回 "Hello, something"。

我的控制器是:

@RestController
public class GreetingController  

    private static final String template = "Hello, %s!";

    @RequestMapping(value="/greeting", method=RequestMethod.POST)
    public String greeting(Person person) 
        return String.format(template, person.getName());
    


人:

public class Person 

    private String name;

    public Person() 
        this.name = "World";
    

    public Person(String name) 
        this.name = name;
    

    public String getName() 
        return this.name;
    

    public void setName(String name) 
        this.name = name;
    

当我向像这样的服务发出请求时

curl -X POST -d '"name": "something"' http://localhost:8081/testapp/greeting

我明白了

Hello, World!

看起来它没有正确地将 json 反序列化为 Person 对象。它使用默认构造函数,然后不设置名称。我发现了这个:How to create a POST request in REST to accept a JSON input? 所以我尝试在控制器上添加一个@RequestBody,但这会导致一些关于“不支持内容类型'application/x-www-form-urlencoded;charset=UTF-8'”的错误。我看到这里有介绍:Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported for @RequestBody MultiValueMap 建议删除 @RequestBody

我已经尝试删除它也不喜欢的默认构造函数。

这个问题涵盖了空值REST webservice using Spring MVC returning null while posting JSON,但它建议添加@RequestBody,但这与上面的冲突......

【问题讨论】:

【参考方案1】:

您必须设置 @RequestBody 来告诉 Spring 应该使用什么来设置您的 personparam。

 public Greeting greeting(@RequestBody Person person) 
    return new Greeting(counter.incrementAndGet(), String.format(template, person.getName()));
 

【讨论】:

正如我在描述中所说,这会导致“不支持内容类型 'application/x-www-form-urlencoded;charset=UTF-8'” 您的内容类型应为Content type 'application/json 您可以使用 PostMan 或其他一些 Json 客户端来测试您的应用程序,我可能会更容易。 没有错,只是不是预期的内容类型 有没有办法让它适用于该内容类型?【参考方案2】:

您必须使用 @RequestMapping(value="/greeting", method=RequestMethod.POST)

设置“produces

使用下面的代码

@RequestMapping(value="/greeting", method=RequestMethod.POST, produces =  MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE )
 public String greeting(@RequestBody Person person) 
        return String.format(template, person.getName());
    

【讨论】:

“produces”指的是响应。反应很好。另外,由于它返回一个纯字符串,它应该是 MediaType.TEXT_PLAIN_VALUE 试试 'consumes = MediaType.ALL_VALUE' @PranayKumbhalkar,consumes = MediaType.ALL_VALUE 不是解决方案。如果您无法通过检查,则解决方案不是禁用检查;解决方案正在改变您发送的内容。

以上是关于Spring rest json 发布空值的主要内容,如果未能解决你的问题,请参考以下文章

Spring data-rest:通过 PATCH 请求设置空值

空值的 Spring Boot JSON 序列化

MS ACCESS 2016 - 使用 Null 进行查询的标准

那些年我们踩过的坑,SQL 中的空值陷阱!

go数组

那些年我们踩过的坑,SQL 中的空值陷阱!