2014-11-13 24 views
5

Die Actuator-Bibliothek von Spring Boot mit Produktionsinformationsendpunkten ist für jede Serveranwendung sehr nützlich. Aber das Problem ist, dass ich keinen Weg finden konnte, mich in eine traditionelle Spring-Anwendung zu integrieren (die keine Spring BOOT-Anwendung ist).Verwenden Sie den Spring Boot Actuator ohne Spring-Boot-Anwendung

Es muss eine Möglichkeit geben, die Endpunkte des Aktors zu verwenden, aber ich konnte sie nicht verkabeln.

Ich habe eine JavaConfig Klasse wie unten

@Configuration 
@ComponentScan(basePackages = { "com.company.helper", "org.springframework.boot" }) 
@EnableWebMvc 
@Import({ DbConfig.class }) 

public class AppConfig extends WebMvcConfigurerAdapter { 

} 

Aber diese Konfiguration einen Fehler bei der Bereitstellung wirft.

Kann diese Verkabelung ohne Spring-Boot-Anwendung durchgeführt werden?

+0

Nun mit dem Kopieren Teil der Konfiguration und Bohnen von Spring Stiefel Sie sollten in der Lage sein. Aber warum nicht einfach Spring Boot zu Ihrer Anwendung hinzufügen? Du verlierst nichts, du gewinnst nur Imho. –

+0

Verwandte Frage: http://StackOverflow.com/Q/29953157/466738 –

Antwort

8

ich hinzugefügt habe Informationen darüber, wie Feder Boot-Aktuator in einer nicht-Boot-Anwendung in diesem Blog-Eintrag hinzufügen

http://givenwhenthen.blogspot.com/2015/09/adding-spring-boot-actuator-to-non.html

In der Klage der build.gradle , Fügte ich die folgende Abhängigkeit hinzu

compile('org.springframework.boot:spring-boot-actuator:1.2.5.RELEASE'){ 
    exclude group: 'org.springframework.boot', module:'spring-boot-starter-logging'} 

In der Spring Config-Klasse der Anwendung habe ich die folgenden Dinge hinzugefügt:

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.boot.actuate.autoconfigure.EndpointAutoConfiguration; 
import org.springframework.boot.actuate.endpoint.BeansEndpoint; 
import org.springframework.boot.actuate.endpoint.HealthEndpoint; 
import org.springframework.boot.actuate.endpoint.InfoEndpoint; 
import org.springframework.boot.actuate.endpoint.RequestMappingEndpoint; 
import org.springframework.boot.actuate.endpoint.mvc.EndpointHandlerMapping; 
import org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter; 
import org.springframework.boot.actuate.endpoint.mvc.HealthMvcEndpoint; 
import org.springframework.boot.actuate.endpoint.mvc.MvcEndpoint; 

@Configuration 
@Import(EndpointAutoConfiguration.class) 
public class MyAppSpringConfig { 

    @Bean 
    @Autowired 
    //Define the HandlerMapping similar to RequestHandlerMapping to expose the endpoint 
    public EndpointHandlerMapping endpointHandlerMapping( 
    Collection<? extends MvcEndpoint> endpoints 
    ){ 
    return new EndpointHandlerMapping(endpoints); 
    } 

    @Bean 
    @Autowired 
    //define the HealthPoint endpoint 
    public HealthMvcEndpoint healthMvcEndpoint(HealthEndpoint delegate){ 
    return new HealthMvcEndpoint(delegate, false); 
    } 

    @Bean 
    @Autowired 
    //define the Info endpoint 
    public EndpointMvcAdapter infoMvcEndPoint(InfoEndpoint delegate){ 
     return new EndpointMvcAdapter(delegate); 
    } 

    @Bean 
    @Autowired 
    //define the beans endpoint 
    public EndpointMvcAdapter beansEndPoint(BeansEndpoint delegate){ 
    return new EndpointMvcAdapter(delegate); 
    } 

    @Bean 
    @Autowired 
    //define the mappings endpoint 
    public EndpointMvcAdapter requestMappingEndPoint( 
    RequestMappingEndpoint delegate 
    ){ 
    return new EndpointMvcAdapter(delegate); 
    } 
} 

Wenn Sie eine zusätzliche Abhängigkeit loswerden wollen, dann beziehen Sie sich bitte auf den Blogpost.

UPDATE

Auch müssen Sie Sie eine Bohne für RequestMappingHandlerAdapter definiert stellen Sie sicher haben, wenn Sie es nicht die ServletDispatcher nicht in der Lage sein müssen, den Adapter für den Handler Ihrer HealthMvcEndpoint zu holen.

wenn Sie nicht haben es fügen Sie ihn einfach zu Ihrer Bean-Konfigurationsdatei

xml Konfigurationen:

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> 
     <property name="messageConverters"> 
      <list> 
       <ref bean="jsonConverter"/> 
      </list> 
     </property> 
    </bean> 

    <bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> 
     <property name="supportedMediaTypes" value="application/json" /> 
     <property name="prettyPrint" value="true" /> 
    </bean> 
+1

Während Ihr Link die Frage möglicherweise beantwortet, sollten Sie die relevanten Teile in Ihre Antwort aufnehmen und den Link nur als Referenz angeben. –

+0

Wenn ich den Health-Endpunkt erreiche, erhalte ich immer den Status UNBEKANNT erhalten Sie gültige Gesundheitsstatusinformationen von dieser Konfiguration? –

+0

Ja, wir bekommen Gesundheitsstatus. Sie müssten @ComponentScan ("my.domain.package.of.health.indicators") für Spring hinzufügen, um auf Ihre Gesundheitsindikatoren zu verweisen –

1

In unserem Projekt haben wir einen kleinen Hack verwendet, der für uns funktioniert hat. Um den Aktuator zu aktivieren, verwendeten wir Abhängigkeiten von Spring-Boot in POM.

<dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-actuator</artifactId> 
     <version>1.2.3.RELEASE</version> 
     <type>jar</type> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-validator</artifactId> 
     <version>4.3.2.Final</version> 
    </dependency> 

und nur zusätzliche Konfigurationsklassen wie folgt verwendet:

@EnableConfigurationProperties 
@Configuration 
@EnableAutoConfiguration 
@Import(EndpointAutoConfiguration.class) 
public class SpringBootActuatorConfig { 

} 
1

Das Projekt arbeite ich an verwendet Spring, aber weder Frühling-Boot noch Frühlings-MVC. Die folgende Lösung mag zwar nicht so auto- magisch sein wie der Aktor mit Boot, aber sie macht die Endpunkte ziemlich knapp.

Grundsätzlich sind alle Aktuatorendpunkte nur Beans, Sie können also eine neue Komponente und einen Autowire an den Endpunkten erstellen, wie Sie es für richtig halten.

Die einzigen zusätzlichen Abhängigkeiten in meinem pom feder Boot-Antrieb und Feder webmvc:

<dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-actuator</artifactId> 
     <version>1.2.1.RELEASE</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-webmvc</artifactId> 
     <version>4.1.4.RELEASE</version> 
    </dependency> 

alles, was Sie dann eine einzelne Komponente Klasse tun müssen, ist zu erstellen (vielleicht ist es registrieren, wenn Sie benötigen) . Stellen Sie sicher, mit @EnableAutoConfiguration mit Anmerkungen versehen:

@Component 
@EnableAutoConfiguration 
@Path("/actuator/") 
public class ActuatorResource { 

private ObjectMapper mapper = new ObjectMapper(); 


@Autowired 
private DumpEndpoint dumpEndpoint; 

@GET 
@Produces("application/json") 
@Path("/dump") 
@Transactional(readOnly = true) 
public String getDump() throws JsonProcessingException { 
    return mapper.writeValueAsString(dumpEndpoint.invoke()); 
} 

@Autowired 
private EnvironmentEndpoint envEndpoint; 

@GET 
@Produces("application/json") 
@Path("/environment") 
@Transactional(readOnly = true) 
public String getEnvironment() throws JsonProcessingException { 
    return mapper.writeValueAsString(envEndpoint.invoke()); 
} 

} 
+0

Bitte lesen Sie diesen Beitrag: https://StackOverflow.com/Questions/32383875/does-having-spring-boot-actuator-changes-the-context -root-of-the-spring-applicat –

+0

haben Sie ein funktionierendes Beispiel dafür? –

Verwandte Themen