使用jsonobject的带有restcontroller的spring boot不起作用

Posted

技术标签:

【中文标题】使用jsonobject的带有restcontroller的spring boot不起作用【英文标题】:spring boot with restcontroller using jsonobject not working 【发布时间】:2018-05-12 07:45:00 【问题描述】:

我使用的是spring boot,如果我使用jsonobject类型请求,则在制作restcontroller或controller时它不起作用,而当我将类型更改为string时同样有效。

@Controller
@RequestMapping("rest/dummy")

public class CustomerController 

    @GetMapping("test")
    public ResponseEntity test(@RequestParam("req") JSONObject inputData) 
        org.json.JSONObject response = new org.json.JSONObject();
        response.put("abc", "123");
        return new ResponseEntity(inputData.toString(), HttpStatus.OK);
    

pom.xml:

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>1.5.8.RELEASE</version>
</dependency>
<dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20171018</version>
        </dependency>
        <dependency>
            <groupId>javax.persistence</groupId>
            <artifactId>persistence-api</artifactId>
            <version>1.0.2</version>
        </dependency>

我确实想同时使用 GET 和 POST 类型,并且我想将 jsonobject 用于请求和响应,因为数据可以随时更改及其类型。

【问题讨论】:

Returning JSON object as response in Spring Boot的可能重复 【参考方案1】:

在 RequestParam 中,我们发送在 URL 中添加的键值, 要发送 Json 对象,请在 RequestBody 中发送。

使用 @RequestBody 并在请求的正文部分发送您的 Json。

【讨论】:

我也想使用 GET 类型,那样的话我必须在 URL 中传递它 RequestParam 始终为 string ,在您的方法中将该字符串转换为 Json 对象,使用 Jackson json 解析器。 不,它不起作用,但我注意到相同的应用程序在 linux 上运行良好,而在 windows 上却不行。在 Linux 中,它使用 RequestParam 作为 JSONObject【参考方案2】:

使用真正的 POJO 作为参数和返回值是 imo 更好的方法。使用 Jackson 注释来配置这些 POJO。

无论如何。这应该有效:

@GetMapping("test")
public ResponseEntity<String> test(@RequestParam("req") JSONObject inputData) 
    org.json.JSONObject response = new org.json.JSONObject();
    response.put("abc", "123");
    return ResponseEntity.ok(inputData.toString());

或者

@GetMapping("test")
public ResponseEntity<SomeOutputDto> test(@RequestParam("req") String inputData) 

    SomeOutputDto out = new SomeOutputDto();
    out.setAbc(123);
    return ResponseEntity.ok(dto);

这需要一个额外的类:SomeOutputDto,但另一方面,您可以更好地控制您的代码。

public class SomeOutputDto 
   private int abc = 0;

  public void setAbc(int v) 
    this.abc = v;
  
  public int getAbc()  return this.abc; 

【讨论】:

试过但没用,我也想使用json,因为我有可以不断变化的请求,并且没有POJO的刚性结构【参考方案3】:

使用 apache-tomcat 8.0.15 可以正常工作,同样不能使用 apache-tomcat 8.0.49

【讨论】:

以上是关于使用jsonobject的带有restcontroller的spring boot不起作用的主要内容,如果未能解决你的问题,请参考以下文章

带有 JSONObject 的 Spring Boot RequestBody

JSONObject.toBean怎么转化带有Timestamp类型的对象

如何将 JSONObject 值分配给 graphql 模式文件中的字段?

将 Gson 的 JsonObject 保存为没有 Members 对象的纯 Json 到 mongoDB

如何在获取值之前对JSONObject中的每个元素进行空检查?

“JSONException:Java.lang.String 类型的值 <br 无法转换为 JSONObject”? [复制]