2017-08-30 312 views
0

因此,我们正在开发一个Android应用程序。在我们的Gradle进口中有以下几种:“MessageBodyReader not found”工作正常后

compile 'org.glassfish.jersey.core:jersey-client:2.25' 
compile 'com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider:2.8.3' 

我们使用这些来在我们的一台服务器上调用REST端点。例如:

enterSpaceTarget.path(Long.toString(skId)).request(MediaType.APPLICATION_JSON).get(); 

Form form = new Form(); 
form = form.param("username", username); 
form = form.param("password", password); 
form = form.param("rememberMe", Boolean.toString(true)); 
loginWebTarget.request().post(Entity.form(form), String.class); 

long before = System.currentTimeMillis(); 
Long server = pingTarget.request(MediaType.APPLICATION_JSON).get(Long.class); 
long after = System.currentTimeMillis(); 

我会为我们继续使用最后一个作为一个例子。看,它工作很棒......大约45分钟。在这个时间范围内运行很多测试是很困难的,但是当你第一次启动应用程序时,一切正常,如果你继续按下按钮,几个小时都可以正常工作,但是在大约45分钟没有进行web客户端调用之后,下一次调用造成失败。在第一个例子,它静静地失败,抛出也不例外,但在第三个例子,它抛出一个MessageBodyProviderNotFoundException,如下:

javax.ws.rs.client.ResponseProcessingException: org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyReader not found for media type=text/html, type=class java.lang.Long, genericType=class java.lang.Long. 
    at org.glassfish.jersey.client.JerseyInvocation.translate(JerseyInvocation.java:811) 
    at org.glassfish.jersey.client.JerseyInvocation.access$700(JerseyInvocation.java:92) 
    at org.glassfish.jersey.client.JerseyInvocation$2.call(JerseyInvocation.java:701) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:228) 
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:444) 
    at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:697) 
    at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:420) 
    at org.glassfish.jersey.client.JerseyInvocation$Builder.get(JerseyInvocation.java:316) 
    at com.....RestClient.ping(RestClient.java:126) 
    at com.....VPBCommunicator.lambda$new$3$VPBCommunicator(VPBCommunicator.java:196) 
    at com.....VPBCommunicator$$Lambda$5.run(Unknown Source) 
    at java.lang.Thread.run(Thread.java:762) 
Caused by: org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyReader not found for media type=text/html, type=class java.lang.Long, genericType=class java.lang.Long. 
    at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:231) 
    at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:155) 
    at org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:1085) 
    at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:874) 
    at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:808) 
    at org.glassfish.jersey.client.ClientResponse.readEntity(ClientResponse.java:326) 
    at org.glassfish.jersey.client.JerseyInvocation.translate(JerseyInvocation.java:806) 
    ... 13 common frames omitted 

我强烈怀疑,这仅仅是一个更深层次问题的表现 - 正如我说,其他一些电话只是失败了。有人知道为什么会发生这种情况,以及如何解决这个问题?

+1

您在服务器上发生错误,这就是为什么您要返回HTML MessageRodyReader not found for media type = text/html'。检查服务器日志,检查请求的正文。在试图在客户端反序列化之前,检查状态码总是一个好主意,这样你可以正确处理错误情况,而不仅仅是失败并且获得当前正在获取的异常 –

+0

@peeskillet好吧,对于一分钟我以为你疯了,但事实证明你是对的。这显然足以让我们的服务器将您注销,并且自动登录过程无法正常工作。 (我们还必须更改重定向的状态码....)谢谢! ...接受答案我该怎么办?你想把你的评论变成答案吗? – Erhannis

回答

0

化MessageBodyReader未找到媒体类型= text/html的

除非text/html的是,你的要求,几乎所有这意味着有在服务器端错误时的类型,你得到的服务器错误页面。你应该检查你的服务器日志,看看问题是什么。另外,首先检查响应的状态以确保您可以正确处理错误,而不是自动尝试反序列化错误响应并最终获得当前正在获取的异常,这总是一个好主意。

Response response = target().request().get(); 
if (isError(response)) { 
    handleError(response); 
} else { 
    Long result = response.readEntity(Long.class); 
}