我正在使用mvn spring-boot:run
启动Spring Boot应用程序。
我的@Controller
之一需要有关应用程序正在侦听的主机和端口的信息,即localhost:8080
(或127.x.y.z:8080
)。在Spring Boot documentation之后,我使用server.address
和server.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.address
和server.port
都无法自动装配。
如何找到Spring Boot应用程序绑定的(本地)主机/地址/ NIC和端口?
答案 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