gpt4 book ai didi

java - 简单的基于REST的程序中的HTTP 500 Internal Server Error。从服务器接收/发送响应时,在GET和POST中感到困惑

转载 作者:行者123 更新时间:2023-12-03 05:40:48 25 4
gpt4 key购买 nike

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

以下是我的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 does not have a no-arg default constructor



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

关于java - 简单的基于REST的程序中的HTTP 500 Internal Server Error。从服务器接收/发送响应时,在GET和POST中感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53126489/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com