web-dev-qa-db-fra.com

Comment obtenir l'hôte et le port du serveur local dans Spring Boot?

Je démarre une application Spring Boot avec mvn spring-boot:run.

Un de mes @Controllers 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?

15
Abdull

Adresse IP

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().

Port

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();
}
14
Kiwi

Vous pouvez obtenir des informations sur le port via

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

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 "";
}
6
Enrico Giurin

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

3
MattEdge

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.

1
vargapeti

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

1
Sen

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ù ...

0
Renetik

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
0
lemonzone2010