Java Spring Boot + REST 应用程序出现“无可用消息”错误
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/34135205/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Getting "No message available" error with Spring Boot + REST application
提问by Naveen
I have created demo Spring Boot project and implemented Restful services as shown here
我已经创建了演示 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);
}
}
When I tried to invoke the service with Postman tool with url "http://localhost:8080/api/greetings" as request method GET, I am getting below error message
当我尝试使用 Postman 工具使用 url“ http://localhost:8080/api/greetings”作为请求方法 GET调用服务时,我收到以下错误消息
{
"timestamp": 1449495844177,
"status": 404,
"error": "Not Found",
"message": "No message available",
"path": "/api/greetings"
}
Per Spring Boot application, I don't have to configure the Spring Dispatcher servlet in web.xml.
对于每个 Spring Boot 应用程序,我不必在 web.xml 中配置 Spring Dispatcher servlet。
Can someone help me to find out the missing point here?
有人可以帮我找出这里的缺失点吗?
采纳答案by cahen
You're probably missing @SpringBootApplication
:
你可能错过了@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
includes @ComponentScan
which scans the package it's in and all children packages. Your controller may not be in any of them.
@SpringBootApplication
包括@ComponentScan
扫描它所在的包和所有子包。您的控制器可能不在其中任何一个中。
回答by prayagupd
Apart from the anotatting the SpringBoot entry point with @SpringBootApplication((scanBasePackages = "com.duwamish.x.y")
so that it includes all the spring components/beans when initialized,
除了对 SpringBoot 入口点进行注释以@SpringBootApplication((scanBasePackages = "com.duwamish.x.y")
使其在初始化时包含所有 spring 组件/bean,
The contextPath also has to be right. If the application is deployed to tomcat with the application name as myapplication
see below,
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
Then REST endpoint would be /myapplication/api/greetings
然后 REST 端点将是 /myapplication/api/greetings
But if the application war is deployed as ROOT
, the endpoint resource will be /api/greetings
only.
但是如果应用程序战争部署为ROOT
,端点资源将是/api/greetings
唯一的。
回答by Arunchunaivendan
If you are using @SpringBootApplication
alone, then make sure your rest service controller is in the same package like below -
如果您@SpringBootApplication
单独使用,请确保您的休息服务控制器在如下相同的包中 -
com.testSpring->SpringBootApplication class com.testSpring.controller->RestfulController classes com.testSpring.model->Model classes ..etc
com.testSpring->SpringBootApplication class com.testSpring.controller->RestfulController classes com.testSpring.model->Model classes ..etc
If you are using @ComponentScan(basePackageClasses = UserController.class)
, then mention specific controller class names.
如果您使用的是@ComponentScan(basePackageClasses = UserController.class)
,请提及特定的控制器类名称。
回答by Gene
Three Possible Solutions:
三种可能的解决方案:
1) Make sure the YourController.java file that has the @Controller and the YourSpringBootFile.java file that has the @SpringBootApplication are in the same package.
1) 确保包含@Controller 的YourController.java 文件和包含@SpringBootApplication 的YourSpringBootFile.java 文件在同一个包中。
So you know what I'm talking about, here is my WebController.java file:
所以你知道我在说什么,这是我的 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));
}
}
Here is my JsonPostExampleProj1Application.java:
这是我的 JsonPostExampleProj1Application.java:
@SpringBootApplication
public class JsonPostExampleProj1Application {
public static void main(String[] args) {
SpringApplication.run(JsonPostExampleProj1Application.class, args);
}
}
2) If you want your controller to be in a different package outside of YourSpringBootFile.java's package, then follow these instructions = Spring: Run multiple "SpringApplication.Run()" in application main method
2) 如果您希望控制器位于 YourSpringBootFile.java 包之外的不同包中,请按照以下说明操作 = Spring: Run multiple "SpringApplication.Run()" in application main method
3) Try using @RestController instead of @Controller on top of your Controller class.
3) 尝试在 Controller 类之上使用 @RestController 而不是 @Controller 。
回答by Silk0vsky
In my case I called the wrong path via ribbon.
就我而言,我通过功能区调用了错误的路径。
@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);
}
Remote currency-exchange
service didn't have handlers for /exchange/{from}/to/{to}
path.
远程currency-exchange
服务没有/exchange/{from}/to/{to}
路径处理程序。
So for nonexistent URL I've got 404 which is fair with "No message available" which is strange.
因此,对于不存在的 URL,我有 404,这与“无可用消息”是公平的,这很奇怪。
回答by Mants
This can help someone as it was in my case.
这可以帮助某人,就像我的情况一样。
Make sure the package name of the controller is the derived (or child) package of your Spring main method package.
确保控制器的包名称是 Spring 主方法包的派生(或子)包。
For example:
例如:
If the main method package is com.company.demo.examplethen the controller package should be like com.company.demo.example.controller(if you specify something like com.company.demo.controllerit won't work!).
如果主要方法包是com.company.demo.example那么控制器包应该像com.company.demo.example.controller(如果你指定像com.company.demo.controller这样的东西,它不会工作!)。
回答by Prabhakar Neelu
all your packages should be after the main package,
你所有的包都应该在主包之后,
like this com.example.demo.* (all your packages)
像这样 com.example.demo.* (你所有的包)
回答by BugsForBreakfast
I just came across this error and none of the solutions above worked for me, so im adding another posible thing that perhaps you can be missing too, make sure that you have annotation @ResponseBody
on your method.
我刚刚遇到了这个错误,上面的解决方案都不适合我,所以我添加了另一个可能你也可能遗漏的东西,确保@ResponseBody
你的方法有注释。
@RequestMapping(value="/yourPath", method=RequestMethod.GET)
@ResponseBody
public String exampleMethod() {
return "test";
}
回答by Akoffice
Actually you need to put the Controller package under same path as your SpringBootApplication java file (spring boot main java class) contains.
实际上,您需要将 Controller 包放在与 SpringBootApplication java 文件(spring boot main java 类)包含的相同路径下。
com.abc | |---- @SpringBootApplication main java class
com.abc | |---- @SpringBootApplication 主java类
com.abc.controller | |---- @RestController class
com.abc.controller | |---- @RestController 类