3

私は Spring RestController を持っています。これはデータを取得するとうまく機能しますが、まったく同じ dataを取得GETしようとすると、 .PUT400 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エラーが発生します。

4

1 に答える 1

3

であるため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() {}
于 2015-07-17T13:45:28.237 に答える