javaspring-bootcontrollerurl-mapping

SpringBoot can't scan Controller and get the URL mapping


I just wrote a Springboot application as a testing Webserver which origins from spring.io. It packaged initially in "jar", changed it to "war" file. And get the application class code as below:

package com.ronzhong;
import org.springframework.boot.Banner.Mode;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.web.context.WebApplicationContext;

@SpringBootApplication(scanBasePackages={"com.ronzhong.libraryManagement"})
public class LibraryManagementApplication extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        application.application().setBannerMode(Mode.OFF);
        return application.sources(SpringApplicationBuilder.class);
    }

    protected WebApplicationContext run(SpringApplication application) {
        return (WebApplicationContext) application.run();
    }

//  public static void main(String[] args) {
//  SpringApplication.run(LibraryManagementApplication.class, args);
//}
}

and the controller is :

package com.ronzhong.libraryManagement;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;


import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.*;

//@CrossOrigin(origins = "http://localhost:4200", maxAge = 3600)
@RestController
@RequestMapping("/api")
public class CounterController {
    @Autowired
    private BookService bookService;

    @PostMapping
    public boolean add(@RequestBody Book book){
        return bookService.add(book);
    }

    @RequestMapping(value = "/books", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
    public Book[] get(){
        return bookService.getBooks();
    }

    @RequestMapping(value = "{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
    public Book findOne(@PathVariable("id") int id){
        return bookService.findById(id);
    }

}

And I also checked the "Dynamic Web Module" in the project facets. Finally, I got these logs when launch tomcat server with this war file generated.

INFO: 2 Spring WebApplicationInitializers detected on classpath
2018-11-28 10:43:31.925  INFO 14888 --- [           main] c.ronzhong.LibraryManagementApplication  : Starting LibraryManagementApplication on ronzhongmachine with PID 14888 (C:\Users\ronzhong\workspace_testserver\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\library-Management\WEB-INF\classes started by ronzhong in C:\tools_installers\eclipse-jee-2018-09-win32-x86_64\eclipse)
2018-11-28 10:43:32.002  INFO 14888 --- [           main] c.ronzhong.LibraryManagementApplication  : No active profile set, falling back to default profiles: default
2018-11-28 10:43:33.910  INFO 14888 --- [           main] o.a.c.c.C.[.[.[/library-Management]      : Initializing Spring embedded WebApplicationContext
2018-11-28 10:43:33.911  INFO 14888 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1604 ms
2018-11-28 10:43:34.362  INFO 14888 --- [           main] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'errorPageFilter' to: [/*]
2018-11-28 10:43:34.704  INFO 14888 --- [           main] c.ronzhong.LibraryManagementApplication  : Started LibraryManagementApplication in 5.958 seconds (JVM running for 36.407)
2018-11-28 10:43:34.955  INFO 14888 --- [           main] org.apache.coyote.ajp.AjpNioProtocol     : Starting ProtocolHandler ["ajp-nio-8009"]
2018-11-28 10:43:34.968  INFO 14888 --- [           main] org.apache.catalina.startup.Catalina     : Server startup in 28177 ms

There're no mappings info in the logs. And if I request with http://localhost:8080/api/books, it will get 404 error. But the logs hasn't change even a little. So I googled the potential causes, and excluded those causes temporarily:

  1. springboot application does not scan the package which controller locates?
    I moved springboot application class to the uplevel package, and also specified what kind of package it should scan. While you see, it doesn't work.
  2. the annotation issue?
    Some people say we should use @RestController annotation instead of @Controller, better add the @ResponseBody, while I did. it does't work, either.
  3. the deployment issue?
    don't know, I did changed the build path of this project, which generated jar file and war file normally, but webapp folder is empty, since I don't have any static resource, I think it's fine, right?

Anyone can help me? very appreciate for your answer, thanks in advance.


Solution

  • From the logs, I can see that your war file name is library-Management, whichh means its deloyed under this folder, as logs states. So you should check http://localhost:8080/library-Management/api/books instead.

    You get 404 from Tomcat, it doesnt hit your app at all, this is ehy you dont see any logs.