Java 基于简单REST的程序中出现HTTP 500内部服务器错误。从服务器接收/发送响应时在GET和POST中混淆

Java 基于简单REST的程序中出现HTTP 500内部服务器错误。从服务器接收/发送响应时在GET和POST中混淆,java,rest,glassfish,jersey,Java,Rest,Glassfish,Jersey,我第一次使用REST服务实现了一个基本的客户机-服务器体系结构。这一次,我将在客户端和服务器之间共享类对象作为参数,从而使包含更多的类和服务变得更加复杂。我正在ApacheTomcat7上运行服务器。它正在成功地执行。当我运行我的客户端时,它给了我一个错误:javax.ws.rs.InternalServerErrorException:HTTP 500内部服务器错误我尝试调试我的代码,似乎我没有正确地接收/发送响应。我知道在这里分享所有课程是不明智的,但我别无选择,因为这浪费了我很多时间。任何

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

下面是我的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;
    }
}
HPResponse是其对象将作为服务器响应返回给客户端的类。HPResponse将基本上返回ImageProgress对象,该对象将给出预期的结果

@XmlRootElement
public class HPCResponse
{
    private ImageProgress imgProgress;

    public ImageProgress getImgProgress() {
        return imgProgress;
    }

    public void setImgProgress(ImageProgress imgProgress) {
        this.imgProgress = imgProgress;
    }
}
以下是名为HpcService的服务器的服务类,它将返回HPResponse的对象作为响应。如您所见,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;
        }
    }
最后是我的客户要求HPC服务

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
公共类DebugExceptionMapper实现ExceptionMapper{
@凌驾
公众响应(例外){
异常。printStackTrace();
返回Response.serverError().entity(exception.getMessage()).build();
} 
}
然后注册映射器。使用
ImageProgress
类运行简单测试时,抛出异常时,会打印stacktrace,您可以看到异常消息

…ImageProgress没有无参数默认构造函数


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

类HPResponse
之前添加这行代码:

@XmlAccessorType(XmlAccessType.FIELD)

但我必须完全删除参数化构造函数。尝试保留它们并添加默认构造函数,但没有成功。因此,删除了所有参数化的参数,并添加了默认值(不带参数)。这是常见的行为吗?@sandeep.ganage在我使用的测试中,我首先允许它失败。然后我所做的就是添加no-arg,结果成功了。我不必移除带有arg的那个。顺便说一句,JAXB并不要求这样做(删除参数化构造函数)。如果您在类中没有实现任何构造函数,Java编译器会代表您在代码中插入默认构造函数。如果使用参数定义任何构造函数,则必须小心实现无参数构造函数
@XmlAccessorType(XmlAccessType.FIELD)