使用Spring启动时请求不会到达控制器

时间:2016-05-26 04:44:38

标签: rest spring-mvc spring-boot

我有Spring MVC项目来开发示例REST api。当我在tomcat中部署应用程序时它正在运行。现在,我想用Spring启动来更新项目。我创建了主要的spring启动应用程序类,如下所示:com.abc.demo.config

@EnableAutoConfiguration  // Sprint Boot Auto Configuration
@ComponentScan(basePackages = "com.abc.demo")
@EnableWebMvc
public class Application extends SpringBootServletInitializer {

    private static final Class<Application> applicationClass = Application.class;
    private static final Logger log = LoggerFactory.getLogger(applicationClass);

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

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(applicationClass);
    }
    @Bean
    public DispatcherServlet dispatcherServlet() {
        return new DispatcherServlet();
    }

}

我的控制器位于com.abc.demo.Controller,如下所示:

@RestController
public class MyController {

    static final Logger logger = Logger.getLogger(MyController.class);

    @Inject
    private MyService myService;
    @RequestMapping(value = "/mytask/{task}", method = RequestMethod.GET, produces = "application/json")
    @ResponseBody
     public int myTask(@PathVariable String task) {
        return myService.service(task);
    }

}

当我在本地tomcat中部署应用程序而不添加spring boot时,它正在部署,我能够看到来自服务的响应。 (当应用程序运行时,我也有web.xml和调度程序servlet)。但是,当我添加spring boot并从命令行运行应用程序时,应用程序正在运行(我在应用程序启动时运行了一些线程,当我看到运行时)。但是当我做curl时,请求根本没有进入控制器并且看到未找到的URI登录到控制台中:没有找到带有URI的HTTP请求的映射为[/ [myservice-name] / myTask 我在这里错过了什么吗?感谢有人指出我错过的东西。

3 个答案:

答案 0 :(得分:1)

使用不围绕它的框架。将Application移至com.abc.demo(或项目的实际根包)。然后删除大部分。所有注释都可以用简单的@SpringBootApplication替换。不要创建DispatcherServlet Spring Boot已经为你做了这个以及配置Spring MVC。

@SpringBootApplication
public class Application extends SpringBootServletInitializer {

    private static final Class<Application> applicationClass = Application.class;
    private static final Logger log = LoggerFactory.getLogger(applicationClass);

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

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(applicationClass);
    }    
}

您可以稍微改善控制器,因为@RestController您不需要@ResponseBody

@RestController
public class MyController {

    static final Logger logger = Logger.getLogger(MyController.class);

    @Inject
    private MyService myService;

    @RequestMapping(value = "/mytask/{task}", method = RequestMethod.GET, produces = "application/json")        
     public int myTask(@PathVariable String task) {
        return myService.service(task);
    }
}

最后我会说你使用的网址是错误的。默认情况下,从命令行运行时,应用程序可用作根应用程序,即/而不是/myservice/mytask/{task}

请尝试使用curl http://localhost:8080/mytask/123,而不是包含应用程序名称。

如果您希望/myservice成为网址的一部分,则可以在server.context-path中为您的应用指定application.properties

server.context-path=/myservice

然后它将被添加到URL前面。

答案 1 :(得分:0)

无需传递您的[myservice-name]。请使用此类网址

  

http://localhost:8080/mytask/somevalue

答案 2 :(得分:0)

这对遇到此问题的人是一个建议: Spring Boot已经非常简单地创建了设置程序。仍然,如果在请求未到达服务器的地方出现错误

很可能您会犯一个常见错误,即从应用程序上下文中声明您的程序包。 第一步: 您的软件包应位于您的根软件包示例中: 如果它是您的根软件包,则您的控制器应位于com.example.demo中。

第二步: 创建一个简单的请求,就像到达您的RequestController一样:

@GetMapping("/test")
    public String testServer() {
        return "Server OK ";
    }

这样可以确保您的请求已经达到要求。