Je démarre une application Spring Boot avec mvn spring-boot:run
.
Un de mes @Controller
s a besoin d’informations sur l’hôte et le port sur lequel l’écoute écoute, c’est-à-dire localhost:8080
(ou 127.x.y.z:8080
). Suite à la documentation Spring Boot , j'utilise les propriétés server.address
et server.port
:
@Controller
public class MyController {
@Value("${server.address}")
private String serverAddress;
@Value("${server.port}")
private String serverPort;
//...
}
Lors du démarrage de l'application avec mvn spring-boot:run
, j'obtiens l'exception suivante:
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
et server.port
ne peuvent pas être connectés automatiquement.
Comment puis-je connaître l'hôte (local), l'adresse, la carte réseau et le port auxquels une application Spring Boot est liée?
Vous pouvez obtenir des interfaces réseau avec NetworkInterface.getNetworkInterfaces()
, puis les adresses IP des objets NetworkInterface renvoyés avec .getInetAddresses()
, puis la représentation sous forme de chaîne de ces adresses avec .getHostAddress()
.
Si vous créez une classe @Configuration
qui implémente ApplicationListener<EmbeddedServletContainerInitializedEvent>
, vous pouvez remplacer onApplicationEvent
pour obtenir le numéro de port une fois qu'il est défini.
@Override
public void onApplicationEvent(EmbeddedServletContainerInitializedEvent event) {
int port = event.getEmbeddedServletContainer().getPort();
}
Vous pouvez obtenir des informations sur le port via
@Value("${local.server.port}")
private String serverPort;
Une solution de contournement facile, au moins pour obtenir le port en cours d'exécution, consiste à ajouter le paramètre javax.servlet.HttpServletRequest dans la signature de l'une des méthodes du contrôleur. Une fois que vous avez le HttpServletRequest instance est facile d’obtenir le baseUrl avec ceci: request.getRequestURL (). ToString ()
Regardez ce code:
@PostMapping(value = "/registration" , produces = "application/json")
public StringResponse register(@RequestBody RequestUserDTO userDTO,
HttpServletRequest request) {
request.getRequestURL().toString();
//value: http://localhost:8080/registration
------
return "";
}
Une solution mentionnée dans une réponse de @M. Deinum est celui que j'ai utilisé dans de nombreuses applications 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
}
J'ai utilisé cette méthode lors de la création d'une URL de rappel pour Oozie REST afin qu'Oozie puisse rappeler vers mon service REST et fonctionne comme un charme
Je viens de trouver un moyen d'obtenir facilement l'adresse IP et le port du serveur en utilisant la bibliothèque client Eureka. Comme je l’utilise quand même pour l’enregistrement de service, ce n’est pas une librairie supplémentaire pour moi juste à cette fin.
Vous devez d'abord ajouter la dépendance maven:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.0.1.RELEASE</version>
</dependency>
Ensuite, vous pouvez utiliser le service ApplicationInfoManager dans n’importe lequel de vos beans Spring.
@Autowired Private ApplicationInfoManager applicationInfoManager;
...
InstanceInfo applicationInfo = applicationInfoManager.getInfo ();
L'objet InstanceInfo contient toutes les informations importantes sur votre service, telles que l'adresse IP, le port, le nom d'hôte, etc.
Pour obtenir le numéro de port dans votre code, vous pouvez utiliser les éléments suivants:
@Autowired
Environment environment;
@GetMapping("/test")
String testConnection(){
return "Your server is up and running at port: "+environment.getProperty("local.server.port");
}
Pour comprendre la propriété Environment, vous pouvez parcourir ceci Spring Boot Environment
Pour le printemps 2
val hostName = InetAddress.getLocalHost().hostName
var webServerPort: Int = 0
@Configuration
class ApplicationListenerWebServerInitialized : ApplicationListener<WebServerInitializedEvent> {
override fun onApplicationEvent(event: WebServerInitializedEvent) {
webServerPort = event.webServer.port
}
}
alors vous pouvez aussi utiliser webServerPort
de n'importe où ...
Vous pouvez obtenir le nom d’hôte à partir de la propriété spring cloud dans spring-cloud-commons-2.1.0.RC2.jar
environment.getProperty("spring.cloud.client.ip-address");
environment.getProperty("spring.cloud.client.hostname");
spring.factories of spring-cloud-commons-2.1.0.RC2.jar
org.springframework.boot.env.EnvironmentPostProcessor=\
org.springframework.cloud.client.HostInfoEnvironmentPostProcessor