算譜王におれはなる!!!!

偏りはあると思うけど情報技術全般についてマイペースに書くよ。

Springで_methodがputやpatchのときにリソースオブジェクトに値がマッピングされない問題(解決済み)

対象はSpring framework 4.3.10, Spring Boot 1.5.5, 1.5.6。

こういう単純なREST APIがあります。

@SpringBootApplication
@RestController
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @PatchMapping("")
    public String patch(TestResource testResource) {
        return "PATCH: " + testResource.getValue();
    }
}

class TestResource {
    private String value;

    public String getValue() {
        return value;
    }

    public void setValue(final String value) {
        this.value = value;
    }
}

ちゃんとPATCHメソッドでリクエストを投げれば問題ないのですが

$ curl -X PATCH http://localhost:8080 -d 'value=HELLO'
PATCH: HELLO

POSTメソッド + _method=patch指定で投げるとTestResourceクラスのvaluenullになってしまいます。

$ curl -X POST http://localhost:8080 -d '_method=patch' -d 'value=HELLO'
PATCH: null

これはどうやらSpring自体のバグっぽくて(https://jira.spring.io/browse/SPR-15828)、Spring 4.3.11で修正されているので、Spring 4.3.10の使用を避けます。 スナップショットですがSpring Boot 1.5.7を使うか、Springのバージョンを4.3.11.BUILD-SNAPSHOTと直接指定してやればOKです。