Getting "No message available" error with Spring Boot + REST application

76,693

Solution 1

You're probably missing @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.

Solution 2

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.

For example, this is wrong: enter image description here

This is the right way: enter image description here

So you know what I'm talking about, here is my WebController.java file:

@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:

@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

3) Try using @RestController instead of @Controller on top of your Controller class.

Solution 3

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.

For example:

If the main method package is com.company.demo.example then the controller package should be like com.company.demo.example.controller (if you specify something like com.company.demo.controller it won't work!).

Solution 4

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,

The contextPath also has to be right. If the application is deployed to tomcat with the application name as myapplication see below,

$ 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

But if the application war is deployed as ROOT, the endpoint resource will be /api/greetings only.

Solution 5

If you are using @SpringBootApplication alone, then make sure your rest service controller is in the same package like below -

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.

Share:
76,693
Naveen
Author by

Naveen

Updated on June 06, 2021

Comments

  • Naveen
    Naveen almost 3 years

    I have created demo Spring Boot project and implemented Restful services as shown here

    @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

    {
      "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.

    Can someone help me to find out the missing point here?