Spring Boot:在映射级别指定端口

时间:2016-09-14 15:42:22

标签: spring spring-boot port

Spring Boot:我想实现以下目标:一些URL路径映射到一个端口,一些映射到另一个端口。

换句话说,我喜欢这样的东西:

public class Controller1 {
  @RequestMapping(value="/path1", port="8080") public...
  @RequestMapping(value="/path2", port="8081") public...
}

这样我的应用程序就响应localhost:8080 / path1和localhost:8081 / path2

在应用程序中有2个独立的控制器是可以接受的。

我已经通过为tomcat实现EmbeddedServletContainerCustomizer而成功地取得了成功,但如果可能的话,能够在控制器内实现这一点会很好。

有可能吗?

2 个答案:

答案 0 :(得分:4)

您尝试做的事情意味着应用程序正在侦听多个端口。这反过来又意味着你启动了多个tomcat,因为spring-boot软件包在一个端口上启动了一个容器。

你能做什么

您可以使用不同的弹簧配置文件两次启动相同的应用程序。每个配置文件都会配置一个不同的端口。

2个属性:

application-one.properties:server.port=8080

application-two.properties:server.port=8081

2个控制器

@Profile("one")
public class Controller1 {
  @RequestMapping(value="/path1") public...
}

@Profile("two")
public class Controller2 {
  @RequestMapping(value="/path2") public...
}

当提供指定的弹簧曲线时,每个控制器都会被激活。

启动两次

$ java -jar -Dspring.profiles.active=one YourApp.jar
$ java -jar -Dspring.profiles.active=two YourApp.jar

答案 1 :(得分:1)

虽然您无法阻止对不需要的端口进行呼叫,但您可以在控制器方法的其他参数中指定HttpServletRequest,然后使用HttpServletRequest.getLocalPort()获取进行呼叫的端口。

然后,如果请求是在错误的端口上,则可以手动返回HTTP错误代码;如果设计是必须对不同端口上的相同路径进行不同处理,则可以转发到另一个控制器。