我编写了一个具有formParam的rest ful Web服务并返回一个列表。我在邮递员中测试它。但我收到此错误.HTTP状态500.服务器遇到内部错误,导致无法完成此请求错误。 这是我的服务:
@Path("/report")
public class weightingResource {
@POST
@Path("/loadWeightingByPlate")
//@Produces(MediaType.APPLICATION_XML)
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public List<Weighting> 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 {
List<Weighting> weightings = Weighting.LoadWeightingInSpecTimeInSpecPlate(startTime, endTime, plate);
System.out.println("no error");
return weightings;
} catch (Exception ex) {
System.out.println("Exception = " + ex);
return null;
}
}
}
我测试Weighting.LoadWeightingInSpecTimeInSpecPlate(startTime, endTime, plate)
,这项工作正常。能帮助我吗?
堆栈跟踪:
Blockquote21-Aug-2015 17:44:31.133警告[http-nio-8084-exec-197] org.glassfish.jersey.servlet.WebComponent.filterFormParameters对URI http://127.0.0.1:8084/fsc-access/rest/report/loadWeightingByPlate的servlet请求包含表单参数在请求体中,请求体已被servlet或访问请求参数的servlet过滤器使用。只有使用@FormParam的资源方法才能按预期工作。通过其他方式使用请求主体的资源方法将无法按预期工作。 21-Aug-2015 17:44:31.210 SEVERE [http-nio-8084-exec-197] org.glassfish.jersey.message.internal.WriterInterceptorExecutor $ TerminalWriterInterceptor.aroundWriteTo找不到媒体类型= application / xml的MessageBodyWriter,type = class java.util.ArrayList,genericType = java.util.List。
现在我的服务运作良好 我写了一个客户端来使用这个服务,但是我收到一个错误:HTTP 400 Bad Request:javax.ws.rs.BadRequestException
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));
我该如何解决?
答案 0 :(得分:1)
首先,您通过以下消息告知您获得500的原因:
2015年8月21日17:44:31.210严重[http-nio-8084-exec-197] org.glassfish.jersey.message.internal.WriterInterceptorExecutor $ TerminalWriterInterceptor.aroundWriteTo 找不到媒体类型= application / xml,type = class的MessageBodyWriter java.util.ArrayList,genericType = java.util.List。
这表明您的servlet Jersey没有注册MessageBodyWriter
从[{3}}返回true
并带有以下参数
media type=application/xml,
type=class java.util.ArrayList,
genericType=java.util.List
AFAIK Jersey通常可以访问JAXB实现,但是一些JAXB实现无法正确处理List
之类的泛型。我建议你创建一个名为Weightings
的新类,它是Weighting
个对象集合的列表包装器。这与JAXB模型有关。
@XmlRootElement
public class Weightings {
@XmlElement
private final List<Weighting> weightings = new ArrayList<Weighting>();
public List<Weighting> getWeightings() {
return weightings;
}
}
然后修改您的资源以返回新类型:
@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;
}
}
这应该可以修复你的500响应。您的另一个选择是环顾四周并测试可能更好地支持泛型的其他JAXB或application/xml
MessageBodyWriter
实现。
你得到的另一个警告:
2015年8月21日17:44:31.133警告[http-nio-8084-exec-197] org.glassfish.jersey.servlet.WebComponent.filterFormParameters A. 对URI的servlet请求 isWritable() 包含请求正文中的表单参数,但请求正文包含 已被Servlet或访问请求的servlet过滤器使用 参数。只有使用@FormParam的资源方法才能工作 预期。通过其他方式使用请求体的资源方法 不会按预期工作。
如果您对修复警告感兴趣,我会看一下http://127.0.0.1:8084/fsc-access/rest/report/loadWeightingByPlate。