我有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 我在这里错过了什么吗?感谢有人指出我错过的东西。
答案 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]。请使用此类网址
答案 2 :(得分:0)
这对遇到此问题的人是一个建议: Spring Boot已经非常简单地创建了设置程序。仍然,如果在请求未到达服务器的地方出现错误
很可能您会犯一个常见错误,即从应用程序上下文中声明您的程序包。 第一步: 您的软件包应位于您的根软件包示例中: 如果它是您的根软件包,则您的控制器应位于com.example.demo中。
第二步: 创建一个简单的请求,就像到达您的RequestController一样:
@GetMapping("/test")
public String testServer() {
return "Server OK ";
}
这样可以确保您的请求已经达到要求。