首页 > 解决方案 > 在端口 -1 上为项目 [] 启动存根服务器

问题描述

我正在尝试为消费者创建一个单一的(胖的)弹簧引导罐,并将生产者的存根作为对它的依赖。有了这个,当我启动消费者应用程序时,它也应该启动合同存根。

这是我到目前为止所做的:

我使用了这个 pom 示例(https://github.com/spring-cloud-samples/spring-cloud-contract-samples/blob/master/producer_with_external_contracts/pom.xml#L98)并为生产者创建了一个胖罐

生产者.pom

<plugin>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-contract-maven-plugin</artifactId>
                <version>${spring-cloud-contract.version}</version>
                <configuration>
                    <baseClassMappings>
                        <baseClassMapping>
                            <contractPackageRegex>.*contract.*</contractPackageRegex>
                        </baseClassMapping>
                    </baseClassMappings>
                    <contractDependency>
                        <groupId>com.groupId</groupId>
                        <artifactId>producer</artifactId>
                    </contractDependency>
                    <contractsMode>LOCAL</contractsMode>
                    <classifier>stubs</classifier>
                    <basePackageForTests>com.groupId.producer</basePackageForTests>
                    <convertToYaml>true</convertToYaml>
                </configuration>
            </plugin>

然后将其导入到我的 consumer.pom 中,如下所示:

<dependency>
            <groupId>com.groupId</groupId>
            <artifactId>producer</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

应用属性如下: producer - application.properties server.port=8081

消费者 - application.properties

stubrunner.ids=com.groupId:producer:+:stubs:8081
stubrunner.stubsMode=LOCAL
stubrunner.repositoryRoot=com.groupId.producer
stubrunner.minPort=8081

ControllerTests.java

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)
@AutoConfigureMockMvc
@AutoConfigureJsonTesters
@AutoConfigureStubRunner( ids = "com.groupId:producer:+:stubs:8081", 
    stubsMode = StubRunnerProperties.StubsMode.LOCAL ) 
@DirtiesContext
public class ContractTests extends AbstractTest {

... 
}

ConsumerApplication.java

@SpringBootApplication
@EnableWebMvc
@EnableStubRunnerServer
@Slf4j
public class ConsumerApplication {
...
}

合同服务.java

public class ContractService {

public @ResponseBody MockResponse verifyWithContract(SomeObj someObj) {

        ResponseEntity<MockResponse> response = this.restTemplate.exchange(
                RequestEntity
                .post(URI.create( http://localhost:8081/someEndpoint ))
                .contentType(MediaType.APPLICATION_JSON)
                .body(someObj), MockResponse.class);

        return response.getBody();
    }
}

我有两个问题:

  1. 当我运行测试时,出现以下异常:

org.springframework.beans.factory.UnsatisfiedDependencyException:创建名为“org.springframework.cloud.contract.stubrunner.server.HttpStubsController”的bean时出错:通过构造函数参数0表示不满足的依赖关系;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建 org.springframework.cloud.contract.stubrunner.spring.StubRunnerConfiguration 中定义的名称为“batchStubRunner”的 bean 时出错:通过工厂方法进行 Bean 实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [org.springframework.cloud.contract.stubrunner.BatchStubRunner]:工厂方法“batchStubRunner”抛出异常;嵌套异常是 java.lang.IllegalStateException:

我也在测试中尝试了以下方法,但这没有帮助:

@AutoConfigureStubRunner( ids = "com.groupId:producer:+:stubs:8081", 
    stubsMode = StubRunnerProperties.StubsMode.REMOTE, rootRepository="com.groupId.producer" ) 
  1. 忽略测试失败,当我启动应用程序时,它以以下日志行开始正常
2019-04-09 11:38:50.454  INFO 75383 --- [           main] o.s.c.contract.stubrunner.StubServer     : Started stub server for project [com.groupId:producer:0.0.1-SNAPSHOT:stubs] on port -1
2019-04-09 11:38:50.454  INFO 75383 --- [           main] o.s.c.c.stubrunner.StubRunnerExecutor    : All stubs are now running RunningStubs [namesAndPorts={com.gorupId:producer:0.0.1-SNAPSHOT:stubs=-1}]
2019-04-09 11:38:50.673  INFO 75383 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (https) with context path ''

但是当我向其余 URL 发送请求时:https://localhost:8080/someEndpoint 它返回以下错误:

{
    "timestamp": 1554837050058,
    "status": 500,
    "error": "Internal Server Error",
    "message": "I/O error on POST request for \"http://localhost:8081/someEndpoint\": Connect to localhost:8081 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused (Connection refused); nested exception is org.apache.http.conn.HttpHostConnectException: Connect to localhost:8081 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused (Connection refused)",
    "path": "/someEndpoint"
}

日志行:

2019-04-09 12:10:50.045 ERROR 75383 --- [nio-8080-exec-5] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.web.client.ResourceAccessException: I/O error on POST request for "http://localhost:8081/someEndpoint": Connect to localhost:8081 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused (Connection refused); nested exception is org.apache.http.conn.HttpHostConnectException: Connect to localhost:8081 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused (Connection refused)] with root cause

java.net.ConnectException: Connection refused (Connection refused)
at java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:1.8.0_171]
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[na:1.8.0_171]
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[na:1.8.0_171]
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[na:1.8.0_171]
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_171]
    at java.net.Socket.connect(Socket.java:589) ~[na:1.8.0_171]
    at org.apache.http.conn.socket.PlainConnectionSocketFactory.connectSocket(PlainConnectionSocketFactory.java:75) ~[spring-cloud-contract-shade-2.1.1.RELEASE.jar:2.1.1.RELEASE]


我想我缺少一些 stubRunner 端口的 stubRunner 配置。

标签: spring-cloud-contract

解决方案


推荐阅读