获取"没有可用消息" Spring Boot + REST应用程序出错

时间:2015-12-07 13:52:10

标签: java spring rest spring-mvc spring-boot

我已经创建了演示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);
    }
}

当我尝试使用带有网址&#34; http://localhost:8080/api/greetings&#34;的Postman工具调用服务时作为请求方法GET,我收到以下错误消息

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

Per Spring Boot应用程序,我不必在web.xml中配置Spring Dispatcher servlet。

有人可以帮我找出这里遗漏的地方吗?

11 个答案:

答案 0 :(得分:7)

您可能遗漏了@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 :(得分:6)

三种可能的解决方案:

1)确保具有@Sptroller的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: Run multiple "SpringApplication.Run()" in application main method

3)尝试在Controller类之上使用@RestController而不是@Controller。

答案 2 :(得分:2)

除了使用@SpringBootApplication((scanBasePackages = "com.duwamish.x.y")对SpringBoot入口点进行anotatting,以便在初始化时包含所有spring组件/ 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

答案 3 :(得分:2)

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

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

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

答案 4 :(得分:1)

我只是遇到了这个错误,上面的解决方案都不适合我,因此我添加了另一个可能的东西,也许您也可能会错过它,请确保您的方法上具有注解@ResponseBody

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

答案 5 :(得分:0)

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

@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,这很合理,带有“无可用消息”,这很奇怪。

答案 6 :(得分:0)

这可以像我一样帮助某人。

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

例如:

如果主要方法包是 com.company.demo.example ,则控制器包应类似于 com.company.demo.example .controller (如果您指定类似 com.company.demo.controller 的内容,则将无效!)。

答案 7 :(得分:0)

实际上,您需要将Controller软件包放在与SpringBootApplication Java文件(Spring Boot主Java类)包含的路径相同的路径下。

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

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

答案 8 :(得分:0)

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

答案 9 :(得分:0)

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

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

答案 10 :(得分:-1)

所有软件包都应位于主软件包之后,

像这个com.example.demo。*(您所有的软件包)