我有一个具有以下方法代码的Web服务:
private static Semaphore reacted = new Semaphore(0);
@Path("/p1")
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public UserDefinedClass postMethod1( UserDefinedClass udc) {
If (Condition A)
semaphore.acquire();
System.out.println("Test");
UserDefinedClass u = new UserDefinedClass(udc);
return u;
}
@Path("/p2")
@POST
@Consumes(MediaType.APPLICATION_JSON)
public void postMethod2(UserDefinedClass udc) throws IOException {
...
reacted.release();
}
如果没有发生条件A,则服务会正确地回复到调用环境(将其命名为CE),但是,如果条件A为true,则postMethod1方法将阻止等待有人调用postMethod2。
如果有人致电postMethod2(在从CE致电postMethod1的1分钟内)。 postMethod1被解除阻止,但是,下面的代码在semaphore.acquire();中。永远不会执行,并且“测试”消息不会打印出来,而是在CE中出现以下错误:
org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyReader not found for media type=text/html;charset=utf-8, type=class...
请注意,如果条件A不成立,则CE中不会显示任何错误。这意味着问题不在方法定义上,而在于方法的线程进入等待信号量的等待状态。
CE代码为:
UserDefinedClass udc = new UserDefinedClass();
ClientConfig config = new ClientConfig(JacksonJsonProvider.class);
Client client = ClientBuilder.newClient(config);
String targetUrl = "http://localhost:8080/myApp";
WebTarget target = client.target(targetUrl);
Invocation.Builder invocationBuilder = target.path("rest").
path("p1").
request(MediaType.APPLICATION_JSON);
Response response = invocationBuilder.post(Entity.entity(udc, MediaType.APPLICATION_JSON));
UserDefinedClass u = response.readEntity(UserDefinedClass.class);
那可能是什么问题?!
答案 0 :(得分:1)
我不知道如何使用您的脚本语言来执行此操作,但是内容类型text/html
是错误的。
我也不确定这是响应还是请求部分,但它与APPLICATION_JSON
不匹配或设置不正确。
您应该可以通过调查实际的网络流量来轻松解决此问题(为此,我使用ngrep
,但其他人更喜欢tcpdump
)。