Веб-сервисы Spring boot с актуатором

Я проверил еще несколько подобных вопросов, но решения не нашел.

Итак, у меня есть проект весенней загрузки с настроенными веб-службами:

@Configuration
public class WebServiceConfig {

@Autowired
private Bus bus;

@Bean
public Endpoint endpoint() {
    EndpointImpl endpoint = new EndpointImpl(bus, new ServiceImpl());
    endpoint.publish("/ws");
    return endpoint;
}
}

ServiceImpl, например:

@javax.jws.WebService(serviceName = "ServiceImpl", portName = "ServiceImplPort", targetNamespace = "http://serivce.com/", endpointInterface = "pac.service...")
public class ServiceImpl... 

сервис работает нормально.

Мой POM для этой реализации выглядит так:

...
<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-ws</artifactId>
        <version>1.3.5.RELEASE</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-spring-boot-starter-jaxws</artifactId>
        <version>3.1.7</version>
    </dependency>
   ...

MainClass:

 @Configuration
 @EnableAutoConfiguration
 @EnableScheduling
 @EnableWebMvc
 @ComponentScan("com.package")
 public class Application extends SpringBootServletInitializer {

public static void main(String[] args) throws Exception {
    SpringApplication.run(Application.class, args);
}

@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    return application.sources(Application.class);
} }

Пока все работает нормально - WS доступен, но если я добавлю в POM:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-actuator</artifactId>
        <version>1.3.5.RELEASE</version>
    </dependency>

запуск приложения, я вижу в логах:

EndpointHandlerMapping: сопоставлено "{[/ info

EndpointHandlerMapping: Mapped "{[/ health и т. Д.

а также:

ServerImpl: установка адреса публикации сервера как / ws

поэтому он запускается без каких-либо ошибок, и похоже, что привод должен работать, но когда я попытался вызвать конечные точки привода, я получил ошибку 404.

когда я вызываю: localhost: 8081 / info

Я получаю: Служба не найдена.

Я пробовал использовать:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

но тогда WS был недоступен (как и конечные точки привода)

любое предложение?


person user1055201    schedule 16.09.2016    source источник
comment
Почему вы используете @EnableWebMvc? Это отключает автоконфигурацию Spring MVC в Boot, чтобы вы могли полностью контролировать ее конфигурацию. Однако я не вижу никаких признаков того, что вы настраиваете его самостоятельно.   -  person Andy Wilkinson    schedule 17.09.2016
comment
Я удалил @EnableWebMvc. Тем не менее, когда я вызываю / info и т. Д., Я получаю: ServletController: не могу найти запрос на localhost: 8081 / info's Наблюдатель   -  person user1055201    schedule 18.09.2016
comment
Трудно сказать, что еще не так, из фрагментов кода и конфигурации, которыми вы поделились. Полный пример, опубликованный, например, в репозитории GitHub, упростил бы задачу.   -  person Andy Wilkinson    schedule 18.09.2016


Ответы (2)


Вы сопоставили сервлет диспетчера Spring Boot с /, а сервлет CXF с /*. Это показано в выходных данных журнала вашего приложения:

2016-09-18 19:51:20.538  INFO 31932 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean        : Mapping servlet: 'dispatcherServlet' to [/]
2016-09-18 19:51:20.540  INFO 31932 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean        : Mapping servlet: 'CXFServlet' to [/*]

Эти сопоставления конфликтуют, и сервлет CXF выигрывает. Это означает, что он будет обрабатывать каждый запрос, сделанный к вашему приложению. Это не позволяет, например, исполнительному механизму Spring Boot обрабатывать запрос к /info.

Вы можете решить проблему, переместив CXF на другой путь, настроив cxf.path в application.properties:

cxf.path=/cxf

Затем это соответствующим образом изменит отображение его сервлета:

2016-09-18 19:52:35.203  INFO 32213 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean        : Mapping servlet: 'dispatcherServlet' to [/]
2016-09-18 19:52:35.205  INFO 32213 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean        : Mapping servlet: 'CXFServlet' to [/cxf/*]

Теперь вы можете получить доступ к конечной точке /info привода:

curl localhost:8080/info -i
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
X-Application-Context: application
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Sun, 18 Sep 2016 18:57:08 GMT

{}

И WSDL вашей службы на основе CXF:

$ curl http://localhost:8080/cxf/ws/Hello?WSDL -i
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
X-Application-Context: application
Content-Type: text/xml;charset=UTF-8
Content-Length: 2286
Date: Sun, 18 Sep 2016 18:59:17 GMT

<?xml version='1.0' encoding='UTF-8'?><wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://service.ws.sample/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:ns1="http://schemas.xmlsoap.org/soap/http" name="HelloService" targetNamespace="http://service.ws.sample/">
  <wsdl:types>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://service.ws.sample/" elementFormDefault="unqualified" targetNamespace="http://service.ws.sample/" version="1.0">

  <xs:element name="sayHello" type="tns:sayHello"/>

  <xs:element name="sayHelloResponse" type="tns:sayHelloResponse"/>

  <xs:complexType name="sayHello">
    <xs:sequence>
      <xs:element minOccurs="0" name="myname" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="sayHelloResponse">
    <xs:sequence>
      <xs:element minOccurs="0" name="return" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>

</xs:schema>
  </wsdl:types>
  <wsdl:message name="sayHello">
    <wsdl:part element="tns:sayHello" name="parameters">
    </wsdl:part>
  </wsdl:message>
  <wsdl:message name="sayHelloResponse">
    <wsdl:part element="tns:sayHelloResponse" name="parameters">
    </wsdl:part>
  </wsdl:message>
  <wsdl:portType name="Hello">
    <wsdl:operation name="sayHello">
      <wsdl:input message="tns:sayHello" name="sayHello">
    </wsdl:input>
      <wsdl:output message="tns:sayHelloResponse" name="sayHelloResponse">
    </wsdl:output>
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="HelloServiceSoapBinding" type="tns:Hello">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="sayHello">
      <soap:operation soapAction="urn:SayHello" style="document"/>
      <wsdl:input name="sayHello">
        <soap:body use="literal"/>
      </wsdl:input>
      <wsdl:output name="sayHelloResponse">
        <soap:body use="literal"/>
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="HelloService">
    <wsdl:port binding="tns:HelloServiceSoapBinding" name="HelloPort">
      <soap:address location="http://localhost:8080/cxf/ws/Hello"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>
person Andy Wilkinson    schedule 18.09.2016
comment
@ Энди, не могли бы вы посоветовать, как сопоставить несколько отображений сервлетов для одного сервлета cxf? Например. cxf.path = / cxf, / api, / здоровье - person stinger; 09.02.2018
comment
@stinger Вы могли бы сделать это, предоставив ServletRegistrationBean для сервлета CXF, но это будет зависеть от того, как реализована интеграция CXF Spring Boot. - person Andy Wilkinson; 09.02.2018

Согласно документации Spring Boot «Настройка конечных точек» "

По умолчанию все конечные точки, кроме shutdown, включены. Если вы предпочитаете специально «соглашаться» на включение конечной точки, вы можете использовать свойство endpoints.enabled. Например, следующее отключит все конечные точки, кроме информации:

Но чтобы быть уверенным, вы должны добавить это в свой application.properties, чтобы вы могли использовать info конечную точку:

endpoints.enabled=true
endpoints.info.enabled=true
person Mickael    schedule 16.09.2016
comment
все еще такая же проблема. в файле журнала я получаю: ServletController: не могу найти запрос для localhost: 8081 / info's Observer - person user1055201; 16.09.2016
comment
КСТАТИ. Я уже настроил привод в нескольких проектах, но это другой случай из-за использования веб-сервисов вместо REST. - person user1055201; 16.09.2016
comment
Установка для свойств значений, которые у них уже есть по умолчанию, не будет иметь никакого значения - person Andy Wilkinson; 17.09.2016