繁体   English   中英

Spring Boot + REST 应用程序出现“无可用消息”错误

[英]Getting "No message available" error with Spring Boot + 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 servlet。

有人可以帮我找出这里的缺失点吗?

您可能缺少@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扫描它所在的包和所有子包。 您的控制器可能不在其中任何一个中。

三种可能的解决方案:

1)确保具有@Controller 的YourController.java 文件和具有@SpringBootApplication 的YourSpringBootFile.java 文件在同一个包中。

例如,这是错误的: 在此处输入图像描述

这是正确的方法: 在此处输入图像描述

所以你知道我在说什么,这是我的 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 类之上使用 @RestController 而不是 @Controller。

这可以帮助某人,就像我的情况一样。

确保控制器的包名是 Spring 主方法包的派生(或子)包。

例如:

如果主方法包是com.company.demo.example那么控制器包应该像com.company.demo.example.controller (如果你指定像com.company.demo.controller这样的东西,它就不起作用了!)。

我刚遇到这个错误,上面的解决方案都不适合我,所以我添加了另一个可能你也可能错过的东西,确保你的方法上有注释@ResponseBody

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

除了使用@SpringBootApplication((scanBasePackages = "com.duwamish.xy") SpringBoot 入口点以便它在初始化时包含所有弹簧组件/bean,

contextPath 也必须是正确的。 如果应用程序部署到tomcat,应用程序名称为myapplication ,如下所示,

$ 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

但是如果应用程序战争被部署为ROOT ,端点资源将仅为/api/greetings

如果您单独使用@SpringBootApplication ,请确保您的休息服务控制器在同一个包中,如下所示 -

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

如果您使用的是@ComponentScan(basePackageClasses = UserController.class) ,请提及特定的控制器类名称。

就我而言,我通过功能区调用了错误的路径。

@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,我得到了 404,这与“没有可用的消息”是公平的,这很奇怪。

实际上,您需要将 Controller 包放在与 SpringBootApplication java 文件(spring boot main java 类)包含的相同路径下。

com.abc | |---- @SpringBootApplication 主java类

com.abc.controller | |---- @RestController 类

对我来说,我有同样的错误,但我意识到我调用 api 的路径是问题所在。 如果我的应用程序名称是demo ,我必须调用http://localhost:9090/AdminProducts来访问 AdminProducts,而不是http://localhost:9090/demo/AdminProducts 在 tomcat 中部署 war 后可能会使用此名称。

如果“没有可用的消息”伴随着 404,只需检查您的 http 请求,任何语法问题都可能是这种情况。

至少我在使用邮递员发帖时请求中出现语法错误。

我得到了同样的错误,但我意识到我正在返回 String 我将它更改为 ResponseEntity 现在它工作得很好。

你所有的包都应该在主包之后,

像这个 com.example.demo.* (你所有的包)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM