Wiremock stubbing error: "Unrecognized field \"timestamp\" (class com.github.tomakehurst.wiremock.common.Errors), not marked as ignorable"
Wiremock stubbing error: "Unrecognized field \"timestamp\" (class com.github.tomakehurst.wiremock.common.Errors), not marked as ignorable"
我来这里是因为我还没有找到解决问题的方法。我实际上是在尝试用 wiremock 存根响应(对 Mocked 服务的调用是通过 FeignClient 完成的)。我的目的是通过真实的假客户端获得虚假响应,不是在测试中,而是在真实应用程序中。因此,在这种情况下,我不是在测试中存根 WireMockServer,而是在 spring 启动应用程序 class 中存根,但是当在那里存根时,我遇到了一个超级奇怪的错误到目前为止调查了很多都没有成功。
这是我目前使用的代码:
@EnableFeignClients
@SpringBootApplication
public class CrmApplication
implements CommandLineRunner
{
private final ConfigurableApplicationContext context;private final ConfigurableApplicationContext context;
@Autowired
public CrmApplication( ConfigurableApplicationContext context )
{
this.context = context;
}
public static void main( String[] args )
{
log.info( "Starting the CRM Validator" );
SpringApplication.run( CrmApplication.class, args );
log.info( "Finishing the CRM Validator" );
}
@Override
public void run( String... args )
{
final WireMockServer server = new WireMockServer( options().port( 8000 ) );
server.start();
log.info( "Wiremock has started in the following url: {}", "http://localhost:8000\n\n" );
String resultJson = "{\"id\":1,\"hasJudicialRecords\":false}";
MappingBuilder mappingBuilder = get( urlPathEqualTo( "/api/v1/judicial-registry/1") )
.willReturn( aResponse().withStatus( 200 )
.withHeader( "Content-Type", "application/json" )
.withBody( resultJson ) )
stubFor( mappingBuilder );
}
}
这实际上在 stubFor( mappingBuilder );
行失败了,这是我得到的异常:
java.lang.IllegalStateException: Failed to execute CommandLineRunner
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:822) ~[spring-boot-2.4.5.jar:2.4.5]
at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:803) ~[spring-boot-2.4.5.jar:2.4.5]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:346) ~[spring-boot-2.4.5.jar:2.4.5]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1340) ~[spring-boot-2.4.5.jar:2.4.5]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1329) ~[spring-boot-2.4.5.jar:2.4.5]
at com.crm.demo.CrmApplication.main(CrmApplication.java:31) ~[main/:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-2.4.5.jar:2.4.5]
Caused by: com.github.tomakehurst.wiremock.common.JsonException: {
"errors" : [ {
"code" : 10,
"source" : {
"pointer" : "/timestamp"
},
"title" : "Error parsing JSON",
"detail" : "Unrecognized field \"timestamp\" (class com.github.tomakehurst.wiremock.common.Errors), not marked as ignorable"
} ]
}
at com.github.tomakehurst.wiremock.common.JsonException.fromJackson(JsonException.java:53) ~[wiremock-jre8-2.28.0.jar:na]
at com.github.tomakehurst.wiremock.common.Json.read(Json.java:55) ~[wiremock-jre8-2.28.0.jar:na]
at com.github.tomakehurst.wiremock.client.HttpAdminClient.safelyExecuteRequest(HttpAdminClient.java:486) ~[wiremock-jre8-2.28.0.jar:na]
at com.github.tomakehurst.wiremock.client.HttpAdminClient.executeRequest(HttpAdminClient.java:454) ~[wiremock-jre8-2.28.0.jar:na]
at com.github.tomakehurst.wiremock.client.HttpAdminClient.addStubMapping(HttpAdminClient.java:131) ~[wiremock-jre8-2.28.0.jar:na]
at com.github.tomakehurst.wiremock.client.WireMock.register(WireMock.java:298) ~[wiremock-jre8-2.28.0.jar:na]
at com.github.tomakehurst.wiremock.client.WireMock.register(WireMock.java:293) ~[wiremock-jre8-2.28.0.jar:na]
at com.github.tomakehurst.wiremock.client.WireMock.givenThat(WireMock.java:104) ~[wiremock-jre8-2.28.0.jar:na]
at com.github.tomakehurst.wiremock.client.WireMock.stubFor(WireMock.java:108) ~[wiremock-jre8-2.28.0.jar:na]
at com.crm.demo.CrmApplication.run(CrmApplication.java:31) ~[main/:na]
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:819) ~[spring-boot-2.4.5.jar:2.4.5]
... 10 common frames omitted
所以一个问题是,wiremock 是否只能在测试中使用?
我已经尝试更改 JSON 及其字段,但这似乎不起作用,所以如果你们中有人知道如何解决该问题将会有所帮助,或者如果你们也知道如何存根@FeignClient 调用的 api 请求(不是在测试中,而是在真实的 spring 应用程序 运行 中)作为替代方案也可能有效。
谢谢!
在 server.start()
之后您需要:
configureFor("localhost", server.port());
我来这里是因为我还没有找到解决问题的方法。我实际上是在尝试用 wiremock 存根响应(对 Mocked 服务的调用是通过 FeignClient 完成的)。我的目的是通过真实的假客户端获得虚假响应,不是在测试中,而是在真实应用程序中。因此,在这种情况下,我不是在测试中存根 WireMockServer,而是在 spring 启动应用程序 class 中存根,但是当在那里存根时,我遇到了一个超级奇怪的错误到目前为止调查了很多都没有成功。
这是我目前使用的代码:
@EnableFeignClients
@SpringBootApplication
public class CrmApplication
implements CommandLineRunner
{
private final ConfigurableApplicationContext context;private final ConfigurableApplicationContext context;
@Autowired
public CrmApplication( ConfigurableApplicationContext context )
{
this.context = context;
}
public static void main( String[] args )
{
log.info( "Starting the CRM Validator" );
SpringApplication.run( CrmApplication.class, args );
log.info( "Finishing the CRM Validator" );
}
@Override
public void run( String... args )
{
final WireMockServer server = new WireMockServer( options().port( 8000 ) );
server.start();
log.info( "Wiremock has started in the following url: {}", "http://localhost:8000\n\n" );
String resultJson = "{\"id\":1,\"hasJudicialRecords\":false}";
MappingBuilder mappingBuilder = get( urlPathEqualTo( "/api/v1/judicial-registry/1") )
.willReturn( aResponse().withStatus( 200 )
.withHeader( "Content-Type", "application/json" )
.withBody( resultJson ) )
stubFor( mappingBuilder );
}
}
这实际上在 stubFor( mappingBuilder );
行失败了,这是我得到的异常:
java.lang.IllegalStateException: Failed to execute CommandLineRunner
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:822) ~[spring-boot-2.4.5.jar:2.4.5]
at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:803) ~[spring-boot-2.4.5.jar:2.4.5]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:346) ~[spring-boot-2.4.5.jar:2.4.5]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1340) ~[spring-boot-2.4.5.jar:2.4.5]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1329) ~[spring-boot-2.4.5.jar:2.4.5]
at com.crm.demo.CrmApplication.main(CrmApplication.java:31) ~[main/:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-2.4.5.jar:2.4.5]
Caused by: com.github.tomakehurst.wiremock.common.JsonException: {
"errors" : [ {
"code" : 10,
"source" : {
"pointer" : "/timestamp"
},
"title" : "Error parsing JSON",
"detail" : "Unrecognized field \"timestamp\" (class com.github.tomakehurst.wiremock.common.Errors), not marked as ignorable"
} ]
}
at com.github.tomakehurst.wiremock.common.JsonException.fromJackson(JsonException.java:53) ~[wiremock-jre8-2.28.0.jar:na]
at com.github.tomakehurst.wiremock.common.Json.read(Json.java:55) ~[wiremock-jre8-2.28.0.jar:na]
at com.github.tomakehurst.wiremock.client.HttpAdminClient.safelyExecuteRequest(HttpAdminClient.java:486) ~[wiremock-jre8-2.28.0.jar:na]
at com.github.tomakehurst.wiremock.client.HttpAdminClient.executeRequest(HttpAdminClient.java:454) ~[wiremock-jre8-2.28.0.jar:na]
at com.github.tomakehurst.wiremock.client.HttpAdminClient.addStubMapping(HttpAdminClient.java:131) ~[wiremock-jre8-2.28.0.jar:na]
at com.github.tomakehurst.wiremock.client.WireMock.register(WireMock.java:298) ~[wiremock-jre8-2.28.0.jar:na]
at com.github.tomakehurst.wiremock.client.WireMock.register(WireMock.java:293) ~[wiremock-jre8-2.28.0.jar:na]
at com.github.tomakehurst.wiremock.client.WireMock.givenThat(WireMock.java:104) ~[wiremock-jre8-2.28.0.jar:na]
at com.github.tomakehurst.wiremock.client.WireMock.stubFor(WireMock.java:108) ~[wiremock-jre8-2.28.0.jar:na]
at com.crm.demo.CrmApplication.run(CrmApplication.java:31) ~[main/:na]
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:819) ~[spring-boot-2.4.5.jar:2.4.5]
... 10 common frames omitted
所以一个问题是,wiremock 是否只能在测试中使用?
我已经尝试更改 JSON 及其字段,但这似乎不起作用,所以如果你们中有人知道如何解决该问题将会有所帮助,或者如果你们也知道如何存根@FeignClient 调用的 api 请求(不是在测试中,而是在真实的 spring 应用程序 运行 中)作为替代方案也可能有效。
谢谢!
在 server.start()
之后您需要:
configureFor("localhost", server.port());