杰克逊未能转换请求元素

时间:2018-08-27 15:16:37

标签: spring rest jackson slack slack-api

我正在使用Spring来制作一个REST API,该API公开了POST端点。我可以到达端点,但是在读取请求正文时遇到了麻烦。

以下代码有效:fooconst包含发送的对象。

payload

但是,以下代码不起作用:它引发异常。

@RestController
public class RestController {

    @RequestMapping(value = "/endpoint")
    public ResponseEntity endpoint(@RequestParam("payload") String str) throws IOException {
        ObjectMapper objectMapper = new ObjectMapper();
        Payload payload = objectMapper.readValue(str, Payload.class);
        return ResponseEntity.status(HttpStatus.OK).build();
    }

}

例外:

@RestController
public class RestController {

    @RequestMapping(value = "/endpoint")
    public ResponseEntity endpoint(@RequestParam("payload") Payload payload) throws IOException {
        return ResponseEntity.status(HttpStatus.OK).build();
    }

}

为什么后者不起作用?我以为Spring用相同的方式解码请求参数...


更新:我的有效载荷类:

Failed to convert request element: org.springframework.web.method.annotation.MethodArgumentConversionNotSupportedException: Failed to convert value of type 'java.lang.String' to required type 'beans.Payload'; nested exception is java.lang.IllegalStateException: Cannot convert value of type 'java.lang.String' to required type 'beans.Payload': no matching editors or conversion strategy found

更新:我正在用Postman测试端点。这是我要发送的:

@JsonIgnoreProperties(ignoreUnknown = true)
public class Payload {

    @JsonProperty("type")
    private String type;

    @JsonProperty("callback_id")
    private String callbackId;

    @JsonProperty("message_ts")
    private String message_ts;

    @JsonProperty("response_url")
    private String responseUrl;

    protected Payload() {}

    public String getType() {
        return type;
    }

    public String getCallbackId() {
        return callbackId;
    }

    public String getMessage_ts() {
        return message_ts;
    }

    public String getResponseUrl() {
        return responseUrl;
    }

}

这是我得到的错误:

KEY       VALUE
payload   { "type": "test" }

4 个答案:

答案 0 :(得分:0)

有效载荷构造函数不应受到保护。应该是公开的。

将其更改为

<paper-card on-down="_onDown" on-up="_onUp">
  <paper-icon-button on-down="_onDown" on-up="_onUp">Tap me</paper-icon-button>
</paper-card>

否则,控制器在完成映射后将无法创建有效载荷对象。

答案 1 :(得分:0)

使用@RequestBody代替@RequestParam。您的Payload在帖子正文中,@RequestBody批注会将其反序列化为有效内容。

答案 2 :(得分:0)

  1. 只需摆脱Error Code: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'concat('"$[', (json_length(h.`ent_rollup`))-2,']"') from hierarchy h where h.`en' at line 1 即可。由于您没有任何参数化的构造函数,因此很好,Java编译器将负责将默认的构造函数添加到已编译的字节码中。

  2. 您需要更改此

控制器方法

protected Payload() {}

更改

a。将HTTP请求方法更改为@RestController public class RestController { @RequestMapping(value = "/endpoint") public ResponseEntity endpoint(@RequestParam("payload") Payload payload) throws IOException { return ResponseEntity.status(HttpStatus.OK).build(); } } ,而不是POST。 (GET)。

b。将有效负载更改为请求参数的消息正文指令(method = RequestMethod.POST-> @RequestParam("payload") Payload payload)。

将其更改为

@RequestBody Payload payload

答案 3 :(得分:0)

您的网址格式配置错误。试试

@RestController
@RequestMapping(value = "/")
public class PayLoadController {

@RequestMapping(value = "endpoint/",method = RequestMethod.POST)
public ResponseEntity endpoint(@RequestBody Payload payload) throws IOException {
return ResponseEntity.status(HttpStatus.OK).build();
}}

只需复制粘贴此代码,然后重命名控制器文件名即可。 然后将您的数据发布到 本地主机:8080 / endpoint /