restful web services:HTTP Status 500.服务器遇到内部错误,导致无法完成此请求错误

时间:2015-08-21 13:10:57

标签: java web-services http post restful-url

我编写了一个具有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));

我该如何解决?

1 个答案:

答案 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