18072


Spring bootで
<http://blog.rakugakibox.net/entry/2014/11/23/java_spring_boot_rest>
を参考にしてRest APIを作成しています。下記コントローラに対して、curlを使ってPOSTリクエストを送ると`Method now
allowed`エラーが出てしまいます。

コントローラ

[code]

    package controllers;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import org.springframework.http.HttpHeaders;
    import org.springframework.http.HttpStatus;
    import org.springframework.http.ResponseEntity;
    import org.springframework.web.bind.annotation.ModelAttribute;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.util.UriComponentsBuilder;
    
    import models.HogeData;
    
    @RestController
    @RequestMapping("/hoges")
    public class HogeController {
        private static List<HogeData> store = new ArrayList<HogeData>();
    
        @RequestMapping(method = RequestMethod.POST)
        public ResponseEntity<HogeData> post(@ModelAttribute HogeData hogeData, UriComponentsBuilder builder){
            store.add(hogeData);
            HttpHeaders headers = new HttpHeaders();
            headers.setLocation(builder.path("/hoges/{id}").buildAndExpand(store.size()).toUri());
            return new ResponseEntity<>(hogeData, headers, HttpStatus.CREATED);
        }
    
        @RequestMapping(method = RequestMethod.GET)
        public List<HogeData> getter(){
            return store;
        }
    
        @RequestMapping(value = "{id}", method = RequestMethod.GET)
        public HogeData get(@PathVariable int id){
            return store.get(id - 1);
        }
    
    }
    
[/code]

curl

[code]

    curl -i -H "Accept: application/json"        -d "integer=1"        -d "string=aaa"        -d "strings=AAA1" -d "strings=AAA2" -d "strings=AAA3"        http://localhost:8080/hoges
    
[/code]

レスポンス

[code]

    HTTP/1.1 405 Method Not Allowed
    Server: Apache-Coyote/1.1
    Allow: HEAD, GET
    Content-Type: application/json;charset=UTF-8
    Transfer-Encoding: chunked
    Date: Mon, 26 Oct 2015 00:13:44 GMT
    
    {"timestamp":1445818424033,"status":405,"error":"Method Not Allowed","exception":"org.springframework.web.HttpRequestMethodNotSupportedException","message":"Request method 'POST' not supported","path":"/hoges"}
    
[/code]

実行環境  
OS: Mac OS X El Captan  
ビルド: Gradleで`gradle bootRun`を実行

コントローラでPOSTリクエストに対するメソッドは定義しているのでできるはずですがなぜかできません。なぜだかわかりますか。


CC BY-SA 3.0
2015-10-26T00:22:27.883
18067
2015-10-26T02:00:41.303
7232
question
java spring
Spring boot でMethod not allowedエラー


curlのリクエストがGETになっています。

[code]

    -X POST
    
[/code]

オプションを付与して呼び出すことでPOSTリクエストになります。


CC BY-SA 3.0
2015-10-26T00:33:10.467
18068
2015-10-26T00:33:10.467
10724
18067
answer


自己解決しました。

プロジェクトのパッケージ構造が間違っていてコントローラのクラスはスターティングポイントであるApplicationクラスのあるパッケージ配下に置く必要がありましたがそれができていませんでした。

[code]

    src
        ├── main
        │   └── java
        │       └── restexample
        │           └── app
        │               ├── Application.java
        │               ├── controllers
        │               │   └── HogeController.java
        │               └── models
        │                   └── HogeData.java
        └── test
            └── java
    
[/code]

上記のように構成を変更することで正しく呼び出せるようになりました。


CC BY-SA 3.0
2015-10-26T02:00:41.303
18072
2015-10-26T02:00:41.303
7232
18067
answer