我创建一个RESTful Web服务并编写一个客户端来使用它。但是当我运行它时,我采用HTTP 400 Bad Request:javax.ws.rs.BadRequestException exeption。这是我的客户代码:
String webserviceURI = "http://localhost:8084/fsc-access";
ClientConfig clientConfig = new ClientConfig();
Client client = ClientBuilder.newClient(clientConfig);
URI serviceURI = UriBuilder.fromUri(webserviceURI).build();
WebTarget webTarget = client.target(serviceURI);
MultivaluedMap formData = new MultivaluedMapImpl();
formData.add("plate", plate);
formData.add("startTime", start.toString());
formData.add("endTime", end.toString());
Weightings weightings = new Weightings();
weightings.getWeightings().addAll((Collection<? extends Weighting>) webTarget.path("rest").path("report").path("loadWeightingByPlate").
request().accept(MediaType.APPLICATION_XML).post(javax.ws.rs.client.Entity.form(formData), Weightings.class));
这是我的网络服务:
@Path("/report")
public class WeightingRESTfulService {
@POST
@Path("/loadWeightingByPlate")
@Produces(MediaType.APPLICATION_XML)
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public Weightings LoadWeightingInSpecTimeInSpecPlate(
@FormParam("plate") String plate,
@FormParam("startTime") String _startTime,
@FormParam("endTime") String _endTime,
@Context HttpServletRequest req) {
Long startTime = new Long(_startTime);
Long endTime = new Long(_endTime);
try {
Weightings weightings = new Weightings();
weightings.getWeightings().addAll(Weighting.LoadWeightingInSpecTimeInSpecPlate(startTime, endTime, plate));
System.out.println("no error");
return weightings;
} catch (Exception ex) {
System.out.println("Exception = " + ex);
return null;
}
}
}
任何人都可以帮我使用这个网络服务吗?
有一些警告:
21-Aug-2015 23:18:11.797警告[http-nio-8084-exec-123] org.glassfish.jersey.servlet.WebComponent.filterFormParameters对URI http://localhost:8084/fsc-access/rest/report/loadWeightingByPlate的servlet请求包含表单参数在请求体中,请求体已被servlet或访问请求参数的servlet过滤器使用。只有使用@FormParam的资源方法才能按预期工作。通过其他方式使用请求体的资源方法将无法按预期工作。
并且有som exeprions:
线程中的异常&#34; C3P0PooledConnectionPoolManager [identityToken-&gt; 1hge1379bmmvkmpse6n4w | 7936e088] -AdminTaskTimer&#34; java.lang.IllegalStateException:无法用java.lang.IllegalStateException覆盖原因:非法访问:此Web应用程序实例已经停止。无法加载com.mchange.v2.resourcepool.BasicResourcePool $ 1DestroyResourceTask。最终跟随堆栈跟踪是由于为调试目的而抛出的错误以及尝试终止导致非法访问的线程引起的,并且没有功能影响。 在java.lang.Throwable.initCause(Throwable.java:457) 在org.apache.catalina.loader.WebappClassLoader.checkStateForClassLoading(WebappClassLoader.java:1335) 在org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1216) 在org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1177) 在com.mchange.v2.resourcepool.BasicResourcePool.destroyResource(BasicResourcePool.java:1040) 在com.mchange.v2.resourcepool.BasicResourcePool.removeResource(BasicResourcePool.java:1507) 在com.mchange.v2.resourcepool.BasicResourcePool.removeResource(BasicResourcePool.java:1477) 在com.mchange.v2.resourcepool.BasicResourcePool.cullExpired(BasicResourcePool.java:1565) 在com.mchange.v2.resourcepool.BasicResourcePool.access $ 1900(BasicResourcePool.java:44) 在com.mchange.v2.resourcepool.BasicResourcePool $ CullTask.run(BasicResourcePool.java:2089) 在java.util.TimerThread.mainLoop(Timer.java:555) 在java.util.TimerThread.run(Timer.java:505) 引起:java.lang.ClassNotFoundException 在org.apache.catalina.loader.WebappClassLoader.checkStateForClassLoading(WebappClassLoader.java:1334) ......还有10个 线程中的异常&#34; C3P0PooledConnectionPoolManager [identityToken-&gt; 1hge1379bmmw228sz1sso | 53826b99] -AdminTaskTimer&#34; java.lang.IllegalStateException:无法用java.lang.IllegalStateException覆盖原因:非法访问:此Web应用程序实例已经停止。无法加载com.mchange.v2.resourcepool.BasicResourcePool $ 1DestroyResourceTask。最终跟随堆栈跟踪是由于为调试目的而抛出的错误以及尝试终止导致非法访问的线程引起的,并且没有功能影响。 在java.lang.Throwable.initCause(Throwable.java:457) 在org.apache.catalina.loader.WebappClassLoader.checkStateForClassLoading(WebappClassLoader.java:1335) 在org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1216) 在org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1177) 在com.mchange.v2.resourcepool.BasicResourcePool.destroyResource(BasicResourcePool.java:1040) 在com.mchange.v2.resourcepool.BasicResourcePool.removeResource(BasicResourcePool.java:1507) 在com.mchange.v2.resourcepool.BasicResourcePool.removeResource(BasicResourcePool.java:1477) 在com.mchange.v2.resourcepool.BasicResourcePool.cullExpired(BasicResourcePool.java:1565) 在com.mchange.v2.resourcepool.BasicResourcePool.access $ 1900(BasicResourcePool.java:44) 在com.mchange.v2.resourcepool.BasicResourcePool $ CullTask.run(BasicResourcePool.java:2089) 在java.util.TimerThread.mainLoop(Timer.java:555) 在java.util.TimerThread.run(Timer.java:505) 引起:java.lang.ClassNotFoundException 在org.apache.catalina.loader.WebappClassLoader.checkStateForClassLoading(WebappClassLoader.java:1334) ......还有10个
loggingfilter:
22-Aug-2015 00:32:32.969 INFO [http-nio-8084-exec-37] org.glassfish.jersey.filter.LoggingFilter.log 1 * Sending client request on thread http-nio-8084-exec-37
1 > POST http://localhost:8084/fsc-access/rest/report/loadWeightingByPlate
1 > Accept: application/xml
1 > Content-Type: application/x-www-form-urlencoded
22-Aug-2015 00:32:33.015 INFO [http-nio-8084-exec-37] org.glassfish.jersey.filter.LoggingFilter.log 2 * Client response received on thread http-nio-8084-exec-37
2 < 200
2 < Content-Length: 1026
2 < Content-Type: application/xml
2 < Date: Fri, 21 Aug 2015 19:54:48 GMT
2 < Server: Apache-Coyote/1.1
答案 0 :(得分:0)
您的资源正在返回Weightings
的实例,因此您只需要投射它,您不需要执行addAll()
Weightings weightings = new Weightings();
weightings.getWeightings().addAll((Collection<? extends Weighting>) webTarget.path("rest").path("report").path("loadWeightingByPlate").
request().accept(MediaType.APPLICATION_XML).post(javax.ws.rs.client.Entity.form(formData), Weightings.class));
应该是:
Weightings weightings = (Weightings) webTarget.path("rest").path("report").path("loadWeightingByPlate").
request().accept(MediaType.APPLICATION_XML).post(javax.ws.rs.client.Entity.form(formData), Weightings.class));
它不会修复你的400异常,但如果没有它,你将获得ClassCastException。