【问题标题】:Spring MVC @RestController -> PUTting results in "400 Bad Request" no matter what I doSpring MVC @RestController -> 无论我做什么,PUT都会导致“400 Bad Request”
【发布时间】: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


【解决方案1】:

因为它是PUT,所以您定义了produces,但没有定义consumes。可能是端点不知道期望正文采用什么格式,这就是它拒绝它的原因。试试:

查看您提供的源代码后,我可以看到Color 类有一个需要参数的构造函数。由于此构造函数,Jackson 库提供的默认 ObjectMapper 将无法解组 JSON 字符串。尝试将默认构造函数添加到 Color 类旁边的当前构造函数:

public Color(int red, int green, int blue) {

    this.red = setColorLimits(red);
    this.green = setColorLimits(green);
    this.blue = setColorLimits(blue);
}

public Color() {}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 2014-08-25
    • 1970-01-01
    • 2012-04-25
    • 2018-09-21
    相关资源
    最近更新 更多