【发布时间】:2016-12-21 23:26:40
【问题描述】:
已经有一段时间了,我正在更新我的 Spring 和 Spring Boot 技能。为此,我正在构建一个 Web 应用程序。这是我的控制器的一部分:
@Controller
public class LoginController {
@RequestMapping(value = "/validate", method= RequestMethod.GET)
@ResponseBody
public String validate( @RequestParam(RequestConstants.KEY_USERKEY) String userkey) {
String result = loginService.validate(userkey)
? RequestConstants.KEY_SUCCESS
: RequestConstants.KEY_FAILURE;
return result;
}
部署似乎顺利,战争被命名为theta-server并且正在进入tomcat/webapps OK,所以我去我的浏览器并输入:
http://testbox:8080/theta-server/validate?userkey=bob
我得到一个 404。
我查看日志。最初,我什么都没有,然后我发现了这个问题:Spring Boot War deployed to Tomcat,这使我找到了这些文档:http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-create-a-deployable-war-file,现在它正在启动 Spring Boot 应用程序,并且横幅显示在我的日志文件中。
但是没有错误,我想知道为什么我会得到 404。
Spring Security 的日志中有消息表明 validate 周围没有控制,所以它似乎正在获取请求,但没有去任何地方。
另外,看到:Spring Boot Controller 404 并确保我的控制器位于我的 Application 类下的包中。
而且我有一个贯穿整个堆栈的集成测试,所以我确信 Spring 的东西至少编码正确。
【问题讨论】:
-
是否有充分的理由不使用嵌入式容器?不必处理配置外部容器是 Boot 的主要优势之一。
-
@chrylis 不强,不。让我的所有测试实例在我的测试服务器上的一个 tomcat 下运行似乎是个好主意。另一种方法是用我的测试服务器上运行的几个 tomcat 实例交换端口号以进行测试,这是一个旧的、有限的盒子。
-
请记住,您可以将端口设置为 0 以使其随机化。
-
@chrylis 那如果你不知道端口号是什么,你怎么外部测试呢?
-
它在启动时打印端口。如果您正在谈论使用外部自动化工具,那么您将生成一个随机端口并将其设置为环境变量(这就是它在 Cloud Foundry 或 Heroku 等设备上的工作方式)。
标签: java spring spring-mvc tomcat spring-boot