我正在使用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" }
答案 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)
只需摆脱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编译器将负责将默认的构造函数添加到已编译的字节码中。
您需要更改此
控制器方法
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 /