如何在Spring Boot中获取本地服务器主机和端口?

时间:2015-04-28 21:04:17

标签: java spring-boot

我正在使用mvn spring-boot:run启动Spring Boot应用程序。

我的@Controller之一需要有关应用程序正在侦听的主机和端口的信息,即localhost:8080(或127.x.y.z:8080)。在Spring Boot documentation之后,我使用server.addressserver.port属性:

@Controller
public class MyController {

    @Value("${server.address}")
    private String serverAddress;

    @Value("${server.port}")
    private String serverPort;

    //...

}

使用mvn spring-boot:run启动应用程序时,出现以下异常:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'myController': Injection of autowired dependencies failed; nested exception is 
org.springframework.beans.factory.BeanCreationException: Could not autowire field: ... String ... serverAddress; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'server.address' in string value "${server.address}"

server.addressserver.port都无法自动装配。

如何找到Spring Boot应用程序绑定的(本地)主机/地址/ NIC和端口?

9 个答案:

答案 0 :(得分:13)

您可以通过

获取端口信息
@Value("${local.server.port}")
private String serverPort;

答案 1 :(得分:6)

一个简单的解决方法,至少是为了获得正在运行的端口,是在一个控制器方法的签名中添加参数 javax.servlet.HttpServletRequest 。一旦你有 HttpServletRequest 实例就可以直接获得baseUrl: request.getRequestURL()。toString()

看一下这段代码:

@PostMapping(value = "/registration" , produces = "application/json")
public StringResponse register(@RequestBody RequestUserDTO userDTO, 
    HttpServletRequest request) {
request.getRequestURL().toString();
//value: http://localhost:8080/registration
------
return "";
}

答案 2 :(得分:3)

@M回复中提到的一个解决方案。 Deinum是我在许多Akka应用程序中使用的那个:

object Localhost {

  /**
   * @return String for the local hostname
   */
  def hostname(): String = InetAddress.getLocalHost.getHostName

  /**
   * @return String for the host IP address
   */
  def ip(): String = InetAddress.getLocalHost.getHostAddress

}

我在为Oozie REST构建回调网址时使用了这种方法,以便Oozie可以回调我的REST服务并且它就像魅力一样

答案 3 :(得分:1)

要获取代码中的端口号,您可以使用以下命令:

@Autowired
Environment environment;

@GetMapping("/test")
String testConnection(){
    return "Your server is up and running at port: "+environment.getProperty("local.server.port");      
}

要了解Environment属性,您可以完成此操作 Spring boot Environment

答案 4 :(得分:1)

我刚刚找到了一种使用Eureka客户端库轻松获取服务器ip和端口的方法。无论如何,我一直在使用它进行服务注册,对于我来说,这并不是一个额外的库。

您需要先添加Maven依赖项:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    <version>2.0.1.RELEASE</version>
</dependency>

然后,您可以在任何Spring Bean中使用ApplicationInfoManager服务。

@自动连线 私有ApplicationInfoManager applicationInfoManager;

...

InstanceInfo applicationInfo = applicationInfoManager.getInfo();

InstanceInfo对象包含有关服务的所有重要信息,例如ip地址,端口,主机名等。

答案 5 :(得分:0)

对于Spring 2

val hostName = InetAddress.getLocalHost().hostName

var webServerPort: Int = 0
@Configuration
class ApplicationListenerWebServerInitialized : ApplicationListener<WebServerInitializedEvent> {
    override fun onApplicationEvent(event: WebServerInitializedEvent) {
        webServerPort = event.webServer.port
    }
}

然后您还可以在任何地方使用webServerPort ...

答案 6 :(得分:0)

您可以从spring-cloud-commons-2.1.0.RC2.jar中的spring cloud属性获取主机名

environment.getProperty("spring.cloud.client.ip-address");
environment.getProperty("spring.cloud.client.hostname");

spring-cloud-commons-2.1.0.RC2.jar的spring.factory

org.springframework.boot.env.EnvironmentPostProcessor=\
org.springframework.cloud.client.HostInfoEnvironmentPostProcessor

答案 7 :(得分:0)

我曾经在application.properties中这样声明配置(您可以使用自己的属性文件)

server.host = localhost
server.port = 8081

在应用程序中,您可以通过@Value("${server.host}")@Value("${server.port}")作为字段级注释轻松获得它。

或者如果您的情况是动态的,则无法从系统属性中获得

这里是例子

@Value(“#{systemproperties ['server.host']}”))
@Value(“#{systemproperties ['server.port']}”)

要更好地理解此注释,请参见以下示例Multiple uses of @Value annotation

答案 8 :(得分:-1)

@Value("${hostname}")
private String hostname;

主机名是系统环境属性,可以通过/actuator/env

获取