当前位置: 首页 > 知识库问答 >
问题:

带执行器的Spring boot web服务

利思源
2023-03-14

我检查了其他几个类似的问题,但没有找到解决方案。

因此,我有一个配置了web服务的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>
   ...

主要类别:

 @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>

应用程序启动,我可以在日志中看到:

endpoint处理程序映射:映射”{[/info

EndpointHandlerMapping:映射的“{[/health等。

此外:

ServerImpl:将服务器的发布地址设置为/ws

所以它的启动没有任何错误,看起来执行器应该可以工作,但是当我尝试调用执行器endpoint时,我得到404错误。

当我调用:localhost:8081/info时

我得到:没有找到服务。

我尝试使用:

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

但后来WS无法访问(以及执行器endpoint)

有什么建议吗?

共有2个答案

百里光熙
2023-03-14

根据Spring Boot文档“定制endpoint”

默认情况下,除关闭之外的所有endpoint都已启用。如果您更喜欢专门“选择加入”endpoint启用,您可以使用endpoints.enabled属性。例如,以下将禁用除info之外的所有endpoint:

但可以肯定的是,您应该将其添加到应用程序中。属性,以便您可以使用endpoint:

endpoints.enabled=true
endpoints.info.enabled=true
梁丘经艺
2023-03-14

您已经将Spring Boot的dispatcher servlet映射到/,将CXF的servlet映射到/*。这显示在应用程序的日志输出中:

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 servlet获胜。这意味着它将处理向您的应用程序发出的每个请求。例如,这可以防止Spring Boot的执行器处理对/info的请求。

您可以通过在application.properties中配置cxf.path将CXF移动到另一个路径来解决问题:

cxf.path=/cxf

这将相应地更改其servlet的映射:

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/*]

现在,您可以访问执行器的endpoint:

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

{}

以及基于CXF的服务的WSDL:

$ 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>

 类似资料:
  • 我有一个数据库结果,每一个调用创建500条记录500条,然后下一个500条,然后下一个 我需要运行一个记录每个不同线程执行特定任务的程序 我举的例子如下 ExecutorService executor=Executors.newFixedThreadPool(10); 我的问题是,在完成当前executer服务之前,it需要获得接下来的500个用户并尝试开始处理,我需要停止该操作,直到处理了前5

  • 我已经安装了MySQL 5.5。34,Apache2.2。15和PHP5.5。4在我的linux Redhat系统(2.6.32-220.17.1.el6.x86_64)上按各自的顺序排列。 当php脚本在web浏览器上运行时,它被apache解释为html,尽管它在命令行中运行良好。 我在httpd.conf文件中做了以下更改:我有未注释的LoadMoulesphp5_module模块/libp

  • 我试图使用Business Central的BPMN可视化编辑器设计一个带有ruleflow组的业务流程,这些组将由DRL文件中的规则提取,但ruleflow组中的规则不会触发。 我正在使用Drools工作台(jboss/drools-workbench-showcase:7.18.0.final)和KIE执行服务器(jboss/kie-server-showcase:7.23.0.final)的

  • 关于spring batch tasklet与Task-Executor的步骤,我遇到了一个奇怪的问题。配置是正常和简单的,只是一个tasklet(不是面向块的),如下所示: someBean是一个实例实现的Tasklet接口。stange的问题是,当我启动作业时,execute方法调用了两次: 实际上,创建了两个线程,并执行了两次该逻辑。如果将task-executor更改为普通的(org.sp

  • 我使用的是spring boot 2.0.0。M3带Spring防尘套启动器执行器。我启用了两项健康检查: healt check bean由自动配置创建,但不是由创建。的响应是404。 我做错了什么? 提前感谢 编辑: Mhm致动器项目是否与反应式和webflux一起工作?Ok发现了这个问题:https://github.com/spring-projects/spring-boot/issue