【发布时间】:2015-10-07 05:21:02
【问题描述】:
我有一个 Spring RestController,当我从中 GET 获取数据时效果很好,但是当我尝试 PUT 非常相同的数据时,我得到一个 400 Bad Request。
这是我的控制器的最简单版本,应该仍然可以工作(我省略了GET 方法):
@RestController
@RequestMapping("/configuration/ledstrips/{name}/display")
public class DisplayController {
@ResponseBody
@RequestMapping(method = RequestMethod.PUT, produces = { "application/hal+json" })
public DisplayResource setDisplay(@PathVariable String name, @RequestBody DisplayResource display) {
return display;
}
}
这是DisplayResource:
public class DisplayResource extends ResourceSupport {
private List<Color> pixels;
public List<Color> getPixels() {
return pixels;
}
public void setPixels(List<Color> pixels) {
this.pixels = pixels;
}
}
我几乎从另一个分支复制了这段代码,它在那里工作!
我想不通!
编辑
这是GET-方法:
@ResponseBody
@RequestMapping(method = RequestMethod.GET, produces = { "application/hal+json" })
public DisplayResource getDisplay(@PathVariable String name) {
LEDStripDTO ledStripDTO;
try {
ledStripDTO = ledStripDTOService.getDTO(name);
} catch (IOException | NullPointerException exception) {
throw new LoadFailedException("Error loading LED strip:", exception);
}
Link self = linkTo(methodOn(DisplayController.class).getDisplay(name)).withSelfRel();
DisplayResource displayResource = new DisplayResource();
displayResource.add(self);
try {
displayResource.setPixels(ledStripService.getPixels(ledStripDTO));
} catch (IOException | TimeoutException | AlreadyConnectedException | NotConnectedException exception) {
throw new LoadFailedException("Error getting Information from LED strip:", exception);
}
return displayResource;
}
它产生的结果(对于长度为 1 的 LED 灯条):
{
"pixels": [
{
"red": 0,
"green": 16,
"blue": 0
}
],
"_links": {
"self": {
"href": "http://localhost:8080/configuration/ledstrips/devled/display"
}
}
}
当我发送此邮件时,无论是否带有 _links 段,我都会收到 400 错误。
【问题讨论】:
-
既然我说了,我就从另一个分支复制过来了。依赖项的唯一区别是旧分支上的 Spring Data。我只是把它放回去,可以预见的是,它没有任何区别。
-
PUT 请求本身是什么样的?
-
@Raedwald simples PUT 请求的标头
Content-Type设置为application/json和主体{"pixels":[{"red":0,"green":0,"blue":0}]},这是我从GET方法获得的内容的一个大大简化的版本。它应该将第一个 LED 切换为黑色。 -
如果有人想自己尝试:github.com/synyx/sybil/tree/newpackage(忽略 README,我还没有更新。也请忽略 master 分支中可怕的代码;)。
标签: java spring spring-mvc jackson spring-restcontroller