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