繁体   English   中英

基于简单 REST 的程序中的 HTTP 500 内部服务器错误。 从服务器接收/发送响应时对 GET 和 POST 感到困惑

[英]HTTP 500 Internal Server Error in simple REST based program. Confused in GET and POST while receiving/sending response from server

我第一次使用 REST 服务来实现一个基本的客户端服务器架构。 这一次,我通过在客户端和服务器之间共享类对象作为参数来包含更多类和服务,从而使它变得更加复杂。 我在 ApacheTomcat7 上运行服务器。 它正在成功执行。 当我运行我的客户端时,它给了我错误: javax.ws.rs.InternalServerErrorException: HTTP 500 Internal Server Error我尝试调试我的代码,似乎我没有正确接收/发送响应。 我知道在这里分享所有课程并不明智,但我别无选择,因为它浪费了我很多时间。 任何帮助将不胜感激。 提前致谢。

以下是我的 ImageProgress 类。 这个类同时存在于服务器和客户端。

@XmlRootElement
public class ImageProgress{
    private String name;

    public ImageProgress( String image_name){
        this.name = image_name;
    }

    public String getName() {
        return name;
    }

    public void setName( String name ){
        this.name = name;
    }
}

HPCResponse 是其对象将作为服务器响应返回给客户端的类。 HPCResponse 基本上会返回 ImageProgress 对象,它会给我预期的结果。

@XmlRootElement
public class HPCResponse
{
    private ImageProgress imgProgress;

    public ImageProgress getImgProgress() {
        return imgProgress;
    }

    public void setImgProgress(ImageProgress imgProgress) {
        this.imgProgress = imgProgress;
    }
}

以下是来自名为 HpcService 的服务器的服务类,它将返回 HPCResponse 的对象作为响应。 如您所见,方法 startAnalysing 接受 HPCInfo 对象。 HPCInfo 的描述也在下面给出。

@Path( "/hpc" )
@Consumes( MediaType.APPLICATION_XML )
@Produces( MediaType.APPLICATION_XML )
public class HpcService{

    public HPCInfo hpcInfo;
    public HPCResponse hpcResponse;

    @POST
    @Path( "/analyze" )
    public HPCResponse startAnalysing(HPCInfo _hpcInfo){

        System.out.println( "Started Analyzing..." );

        hpcInfo = _hpcInfo;
        hpcInfo.getImagePath();        

        hpcResponse = new HPCResponse();
        ImageProgress iProg = new ImageProgress(hpcInfo.getImagePath());
        hpcResponse.setImgProgress(iProg);

        System.out.println("Returning response...");
        return hpcResponse;
    }
}

HPCInfo 类也在客户端和服务器上。 HPCInfo 类:

    @XmlRootElement
    public class HPCInfo
    {
        private String imagePath = "";

        public String getImagePath(){
            return imagePath;
        }

        public void setImagePath( String imagePath ){
            this.imagePath = imagePath;
        }
    }

最后是我的客户要求 HPCService。

public class TestClient {
    private static String webServiceURI = "http://localhost:8080/TestServer123";
    public static void main(String[] args) {
        String input = "ABNKidney.scn";
        ClientConfig clientConfig = new ClientConfig();
        Client client = ClientBuilder.newClient(clientConfig);
        URI serviceURI = UriBuilder.fromUri(webServiceURI).build();

        WebTarget webTarget = client.target(serviceURI);

        HPCInfo info = new HPCInfo();
        info.setImagePath(input);

        webTarget = webTarget.path("test").path("hpc").path("analyze");

        HPCResponse hResponse = webTarget.request().accept(MediaType.APPLICATION_XML).post(Entity.entity(info, MediaType.APPLICATION_XML), HPCResponse.class);
    }
}

这是我得到的完整错误描述:

javax.ws.rs.InternalServerErrorException: HTTP 500 Internal Server Error
    at org.glassfish.jersey.client.JerseyInvocation.convertToException(JerseyInvocation.java:968)
    at org.glassfish.jersey.client.JerseyInvocation.translate(JerseyInvocation.java:795)
    at org.glassfish.jersey.client.JerseyInvocation.access$500(JerseyInvocation.java:91)
    at org.glassfish.jersey.client.JerseyInvocation$2.call(JerseyInvocation.java:683)
    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:424)
    at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:679)
    at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:435)
    at org.glassfish.jersey.client.JerseyInvocation$Builder.post(JerseyInvocation.java:338)
    at com.TestClient.main(TestClient.java:34)

调试此类事情的一种方法是创建一个简单的ExceptionMapper来捕获未映射的异常。 当没有映射器时,异常通常会冒泡到容器级别,这只会给我们带来通用的 500 服务器错误(大多数情况下几乎没有帮助)。

@Provider
public class DebugExceptionMapper implements ExceptionMapper<Exception> {

    @Override
    public Response toResponse(Exception exception) {
        exception.printStackTrace();
        return Response.serverError().entity(exception.getMessage()).build();
    } 
}

然后只需注册映射器。 使用ImageProgress类运行简单测试时,抛出异常时,会打印堆栈跟踪,您可以看到异常消息

...ImageProgress 没有无参数的默认构造函数

因此,只需向ImageProgress类添加一个默认值(无参数构造函数)即可。 这是 JAXB 模型的要求。

class HPCResponse之前添加这行代码:

@XmlAccessorType(XmlAccessType.FIELD)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM