CXF 中的错误 header
Bad header in CXF
我正在使用 CXF WebClient,我尝试做一个 webclient 服务并用它进行调用,我设置 JSON 输入 header,但我在header
我这样做是为了制作 webClient
client = WebClient.create(endPoint,Collections.singletonList(new JacksonJsonProvider())).
accept(MediaType.APPLICATION_JSON).type(MediaType.APPLICATION_JSON);
ClientConfiguration config = WebClient.getConfig(client);
config.getInInterceptors().add(new LoggingInInterceptor());
config.getOutInterceptors().add(new LoggingOutInterceptor());
我用这个来拨打 get 电话
Response reponse=clientThreadSafe().path("tokens/{id}",virtualToken.getId()).get();
return genericReponse(Token.class,Status.OK,reponse);
使用 clientThreadSafe
private WebClient clientThreadSafe() throws CertEuropeException{
//thread safe, see http://cxf.apache.org/docs/jax-rs-client-api.html#JAX-RSClientAPI-ThreadSafety
return WebClient.fromClient(client);
}
和 genericReponse
private <T> T genericReponse(Class<T> classReponse, Status status, Response reponse ) throws Exception{
if(reponse.getStatusInfo()!=status){
throw new Exception("somthing bad here");
}
return reponse.readEntity(classReponse);
}
但是我在调用中得到了通配符
INFOS: Setting the server's publish address to be
http://localhost:9090 mars 14, 2016 1:52:31 PM
org.apache.cxf.interceptor.LoggingOutInterceptor INFOS: Outbound
Message
--------------------------- ID: 1 Address: http://localhost:9090/api/v1/tokens/1 Http-Method: GET
Content-Type: Headers: {Accept=[*/*]}
我得到一个例外
GRAVE: No message body reader has been found for class com.client.Token, ContentType: application/octet-stream
mars 14, 2016 1:52:31 PM
org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper toResponse
AVERTISSEMENT: javax.ws.rs.WebApplicationException: HTTP 415 Unsupported Media Type
我不知道为什么 WebClient 没有使用 MediaType.APPLICATION_JSON header,也许我没有使用正确的函数来设置 headers。
如果我尝试使用其他客户端,例如 post 伙计,并且我设置正确 header 一切似乎都正常。
经过大量测试,我发现 "Fluent interface" 并没有像它应该的那样真正工作,看起来顺序很重要,如果你在开始,这个可以重置。
因此,对于每次调用,我都必须在路径方法之后进行 accept(MediaType.APPLICATION_JSON).type(MediaType.APPLICATION_JSON)
,例如:
path("tokens/{id}",token.getId())
.accept(MediaType.APPLICATION_JSON)
.type(MediaType.APPLICATION_JSON)
.invoke("GET", "")
如果我更改顺序,accept 和 type 将不计入计数
我正在使用 CXF WebClient,我尝试做一个 webclient 服务并用它进行调用,我设置 JSON 输入 header,但我在header
我这样做是为了制作 webClient
client = WebClient.create(endPoint,Collections.singletonList(new JacksonJsonProvider())).
accept(MediaType.APPLICATION_JSON).type(MediaType.APPLICATION_JSON);
ClientConfiguration config = WebClient.getConfig(client);
config.getInInterceptors().add(new LoggingInInterceptor());
config.getOutInterceptors().add(new LoggingOutInterceptor());
我用这个来拨打 get 电话
Response reponse=clientThreadSafe().path("tokens/{id}",virtualToken.getId()).get();
return genericReponse(Token.class,Status.OK,reponse);
使用 clientThreadSafe
private WebClient clientThreadSafe() throws CertEuropeException{
//thread safe, see http://cxf.apache.org/docs/jax-rs-client-api.html#JAX-RSClientAPI-ThreadSafety
return WebClient.fromClient(client);
}
和 genericReponse
private <T> T genericReponse(Class<T> classReponse, Status status, Response reponse ) throws Exception{
if(reponse.getStatusInfo()!=status){
throw new Exception("somthing bad here");
}
return reponse.readEntity(classReponse);
}
但是我在调用中得到了通配符
INFOS: Setting the server's publish address to be
http://localhost:9090 mars 14, 2016 1:52:31 PM
org.apache.cxf.interceptor.LoggingOutInterceptor INFOS: Outbound
Message
--------------------------- ID: 1 Address: http://localhost:9090/api/v1/tokens/1 Http-Method: GET
Content-Type: Headers: {Accept=[*/*]}
我得到一个例外
GRAVE: No message body reader has been found for class com.client.Token, ContentType: application/octet-stream
mars 14, 2016 1:52:31 PM
org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper toResponse
AVERTISSEMENT: javax.ws.rs.WebApplicationException: HTTP 415 Unsupported Media Type
我不知道为什么 WebClient 没有使用 MediaType.APPLICATION_JSON header,也许我没有使用正确的函数来设置 headers。
如果我尝试使用其他客户端,例如 post 伙计,并且我设置正确 header 一切似乎都正常。
经过大量测试,我发现 "Fluent interface" 并没有像它应该的那样真正工作,看起来顺序很重要,如果你在开始,这个可以重置。
因此,对于每次调用,我都必须在路径方法之后进行 accept(MediaType.APPLICATION_JSON).type(MediaType.APPLICATION_JSON)
,例如:
path("tokens/{id}",token.getId())
.accept(MediaType.APPLICATION_JSON)
.type(MediaType.APPLICATION_JSON)
.invoke("GET", "")
如果我更改顺序,accept 和 type 将不计入计数