当前位置: 首页 > 知识库问答 >
问题:

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

黎征
2023-03-14

我第一次使用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的服务器的服务类,它将返回HPCRequest的对象作为响应。如您所见,start Analysing方法接受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)

共有2个答案

姚和顺
2023-03-14

将这行代码添加到HPResponse类之前:

@XmlAccessorType(XmlAccessType.FIELD)
单修德
2023-03-14

调试此类事情的一种方法是创建一个简单的异常映射器(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类添加一个默认值(无arg构造函数)。这是JAXB模型的要求。

 类似资料:
  • 问题内容: 我是第一次使用REST服务实现基本的客户端服务器体系结构。这次,通过在客户端和服务器之间共享类对象作为参数来包含更多类和服务,使我变得更加复杂。我在ApacheTomcat7上运行服务器。它正在成功执行。当我运行客户端时,它给我错误:我尝试调试我的代码,似乎我没有正确接收/发送响应。我知道在这里共享所有课程不是一个明智的主意,但是我别无选择,因为这浪费了我很多时间。任何帮助将不胜感激。

  • 我想用Java创建一个非常简单的HTTP服务器应用程序。 例如,如果我在localhost端口8080上运行服务器,并且从浏览器发出以下调用,我希望获得一个带有字符串“hello world!”的Json数组: 我希望在服务器中有类似这样的东西(非常抽象的代码): 我想这个函数实际上不应该“返回”json,而是使用某种HTTP响应处理程序或类似的东西发送它... 最简单的方法是什么,而不需要熟悉许

  • 我在做一个应用程序,把一些数据存储在数据库中,然后它再检索它。在服务器端,我使用的是PHP,在客户端,我有一个获取输入并将其传递给PHP文件的文件。 另外,我有这个JsonParser:

  • 我试着对我的问题进行研究,但一直未能解决它。我正试图在点击时发布Ajax帖子。我已经读到最流行的问题是由于csrf_代币,但我相信我已经妥善处理了? 我不断地发现这个错误: 这是我的密码。。。 我的csrf令牌元标记位于我的主标记顶部。刀身php文件 路线: js函数 } 我的控制器:

  • 我想用ajax向laravel中的控制器发送post请求。ajax请求发送两个输入参数,我希望controller在数据库中找到包含第一个参数的列,然后使用第二个输入参数设置name属性。但是我在控制台500中有这个错误消息(内部服务器错误)。 Ajax功能: 路线: 控制器功能: 而且我导入csrf无处不在,因为上次当我做AJAX调用我有这个csrf的问题,下面的代码已经修复了我的问题,但现在不

  • 我在jmeter V3中录制了脚本。3通过IE浏览器,然后进行关联。当我运行这个脚本时,它会收到内部服务器错误500的响应,但是它在IE浏览器中手动工作正常,而且在记录这个场景时,它不会发生。 我还在网络IE F12开发者工具中交叉验证了头管理器和请求头,它是最新的。 取样器请求 获取请求 它只是一个简单的获取请求。非常感谢您在jmeter中帮助处理此错误。