Gabriel
Gabriel

Reputation: 962

Spring Boot Application Error Page

I'm starting to learn Spring Boot, and I'm following a tutorial on youtube. However, there is an weird thing happening on my project. I just created a Controller called GreetingController. Below is the complete code of the class

@RestController
@EnableAutoConfiguration
public class GreetingController {

    private static BigInteger nextId;

    private static Map<BigInteger, Greeting> greetingMap;

    private static Greeting save(Greeting greeting) {
        if (greetingMap == null) {
            greetingMap = new HashMap<BigInteger, Greeting>();
            nextId = BigInteger.ONE;
        }
        greeting.setId(nextId);
        nextId = nextId.add(BigInteger.ONE);
        greetingMap.put(greeting.getId(), greeting);
        return greeting;
    }

    static {
        Greeting g1 = new Greeting();
        g1.setText("Hello World");
        save(g1);

        Greeting g2 = new Greeting();
        g2.setText("Hola Mundo");
        save(g2);
    }

    @RequestMapping(value = "/api/greetings", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Collection<Greeting>> getGreetings() {

        Collection<Greeting> greetings = greetingMap.values();

        return new ResponseEntity<Collection<Greeting>>(greetings,
                HttpStatus.OK);

    }

}

The controller is under the following package:

enter image description here

However, when I bootstrap the application with the URL http://localhost:8080/api/greetings the following error appears on my page:

enter image description here

But, when I put the GreetingController in the same package of Application class, as the image below:

enter image description here

And then get the same URL http://localhost:8080/api/greetings, I got the right response:

enter image description here

Can anyone explain me why?

Upvotes: 0

Views: 656

Answers (2)

afitnerd
afitnerd

Reputation: 736

If you want to support having a controller in another package, you need to include it in the component scan of your Application.

In Application.java, you could add the following:

@ComponentScan({com.example, org.example})

By default, the package that Application is in will be included in the ComponentScan, which is why it was working for you when you had the controller in the same package as Application.

Also, you don't need the @EnableAutoConfiguration annotation on your controller, FYI.

Upvotes: 1

Ruslan Stelmachenko
Ruslan Stelmachenko

Reputation: 5420

Rename your com.example package to org.example. Spring boot scans for controllers all subpackages of package of class when you place your @SpringBootApplication annotation.

Or put @ComponentScan("org.example") on the same class. This way you tell spring boot where to search your controllers (and other beans).

Upvotes: 3

Related Questions