web-dev-qa-db-ja.com

Spring Bootで「No message available」エラーを取得+ REST application

ここに示すように、Spring Bootプロジェクトのデモを作成し、Restfulサービスを実装しました

@RestController
public class GreetingsController {
    @RequestMapping(value="/api/greetings", method=RequestMethod.GET, produces=MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<String> getGreetings(){
        return new ResponseEntity<String>("Hello World", HttpStatus.OK);
    }
}

URL「 http:// localhost:8080/api/greetings 」をリクエストメソッドGETとしてPostmanツールでサービスを呼び出そうとすると、以下のエラーメッセージが表示されます。

{
  "timestamp": 1449495844177,
  "status": 404,
  "error": "Not Found",
  "message": "No message available",
  "path": "/api/greetings"
}

Spring Bootアプリケーションごとに、web.xmlでSpring Dispatcherサーブレットを構成する必要はありません。

誰かがここで不足している点を見つけるのを手伝ってくれますか?

15
Naveen

おそらく@SpringBootApplicationが欠落しています:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }
}

@SpringBootApplicationには、そのパッケージとすべての子パッケージをスキャンする@ComponentScanが含まれます。あなたのコントローラーはそれらのどれにも入っていないかもしれません。

9
cahen

3つの可能な解決策:

1)@Controllerを持つYourController.Javaファイルと、@ SpringBootApplicationを持つYourSpringBootFile.Javaファイルが同じパッケージにあることを確認してください。

たとえば、これは間違っています: enter image description here

これは正しい方法です: enter image description here

私の言っていることはご存知だと思いますが、ここに私のWebController.Javaファイルがあります。

@RestController
public class WebController {
private static final String template = "Hello, %s!";
    private final AtomicLong counter = new AtomicLong();

    @RequestMapping(value= "/hi", method = RequestMethod.GET)
    public @ResponseBody Greeting sayHello(
            @RequestParam(value = "name", required = false, defaultValue = "Stranger") String name) {
        System.out.println("Inside sayHello() of WebController.Java");
        return new Greeting(counter.incrementAndGet(), String.format(template, name));
    }
}

これが私のJsonPostExampleProj1Application.Javaです。

@SpringBootApplication
public class JsonPostExampleProj1Application {

    public static void main(String[] args) {
        SpringApplication.run(JsonPostExampleProj1Application.class, args);
    }
}

2)コントローラーをYourSpringBootFile.Javaのパッケージ以外の別のパッケージに入れる場合は、次の指示に従ってください= Spring:アプリケーションのメインメソッドで複数の "SpringApplication.Run()"を実行します

3)Controllerクラスの上で@Controllerの代わりに@RestControllerを使用してみてください。

6
Gene

これは私の場合のように誰かを助けることができます。

コントローラーのパッケージ名が、Springメインメソッドパッケージの派生(または子)パッケージであることを確認してください。

例:

メインメソッドパッケージがcom.company.demo.exampleの場合、コントローラーパッケージはcom.company.demo.example.controllercom。 company.demo.controller動作しません!)。

3
Mants

_@SpringBootApplication_を単独で使用している場合、残りのサービスコントローラーが以下のような同じパッケージにあることを確認してください-

_com.testSpring->SpringBootApplication class
com.testSpring.controller->RestfulController classes
com.testSpring.model->Model classes
..etc
_

@ComponentScan(basePackageClasses = UserController.class)を使用している場合は、特定のコントローラークラス名を記載してください。

3

SpringBootエントリポイントを@SpringBootApplication((scanBasePackages = "com.duwamish.x.y")でアノタッティングすることとは別に、初期化時にすべてのスプリングコンポーネント/ Beanが含まれるように、

ContextPathも正しくなければなりません。アプリケーションがmyapplicationのようなアプリケーション名でTomcatにデプロイされている場合、以下を参照してください。

$ ll /usr/local/Apache-Tomcat-8.0.42/webapps/
total 179216
12495017 drwxrwxrwx  17 urayagppd  NORD\Domain Users       578 Mar  8 11:59 ROOT
12495019 drwxrwxrwx  55 urayagppd  NORD\Domain Users      1870 Mar  8 11:59 docs
12495042 drwxrwxrwx   7 urayagppd  NORD\Domain Users       238 Mar  8 11:59 examples
12495109 drwxrwxrwx   7 urayagppd  NORD\Domain Users       238 Mar  8 11:59 Host-manager
12495114 drwxrwxrwx   8 urayagppd  NORD\Domain Users       272 Mar  8 11:59 manager
16169612 drwxr-xr-x   4 urayagppd  NORD\Domain Users       136 May  7 18:47 myapplication
16169594 -rw-r--r--   1 urayagppd  NORD\Domain Users  45340041 May  7 18:47 myapplication.war

次にRESTエンドポイントは/myapplication/api/greetings

ただし、アプリケーションwarがROOTとしてデプロイされる場合、エンドポイントリソースは/api/greetingsのみ。

3
prayagupd

私はこのエラーに遭遇しましたが、上記の解決策はどれもうまくいきませんでしたので、おそらくあなたも見逃している可能性のあるものを追加し、メソッドに注釈@ResponseBodyがあることを確認してください。

@RequestMapping(value="/yourPath", method=RequestMethod.GET)
@ResponseBody
public String exampleMethod() {
return "test";
}
1

私の場合、間違ったパスをリボン経由で呼び出しました。

@FeignClient(name = "currency-exchange")
@RibbonClient(name = "currency-exchange")
public interface CurrencyExchangeProxy {

    @GetMapping("/exchange/{from}/to/{to}")
    PairRateDto callForExchangeValue(@PathVariable("from") String fromValue, @PathVariable("to") String toValue);

}

リモートcurrency-exchangeサービスには、/exchange/{from}/to/{to}パスのハンドラがありませんでした。

そのため、存在しないURLに対しては、「No message available」と奇妙な404があります。

0
Silk0vsky