HTTP 500 Internal Server Erro em um programa simples baseado em REST. Confuso em GET e POST ao receber / enviar resposta do servidor

Eu estou implementando uma arquitetura básica de servidor cliente usando serviços REST pela primeira vez. Desta vez, estou tornando mais complicado include mais algumas classs e serviços com o compartilhamento de objects de class como parâmetros entre cliente e servidor. Estou executando o servidor no ApacheTomcat7. Está sendo executado com sucesso. Quando estou executando meu cliente está me dando erro: javax.ws.rs.InternalServerErrorException: HTTP 500 Internal Server Error Eu tentei depurar meu código, parece que não estou recebendo / enviando resposta corretamente. Eu sei que não é uma boa idéia dividir todas as classs aqui, mas não tenho escolha, já que perdi muito tempo. Qualquer ajuda será apreciada. Desde já, obrigado.

A seguir está minha class ImageProgress. Esta class está presente no servidor e no cliente.

 @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 é a class cujo object será retornado ao cliente como a resposta do servidor. O HPCResponse basicamente retornará o object ImageProgress que me dará o resultado pretendido.

 @XmlRootElement public class HPCResponse { private ImageProgress imgProgress; public ImageProgress getImgProgress() { return imgProgress; } public void setImgProgress(ImageProgress imgProgress) { this.imgProgress = imgProgress; } } 

A seguir está a class de serviço do servidor chamado HpcService, que retornará o object do HPCResponse como resposta. Como você pode ver o método startAnalysing aceita o object de HPCInfo. Descrição do HPCInfo também é fornecida abaixo.

 @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; } } 

A class HPCInfo também está no cliente e no servidor. Classe HPCInfo:

  @XmlRootElement public class HPCInfo { private String imagePath = ""; public String getImagePath(){ return imagePath; } public void setImagePath( String imagePath ){ this.imagePath = imagePath; } } 

E finalmente é o meu cliente chamando pelo 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); } } 

Esta é a descrição completa do erro que estou recebendo:

 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) 

Isso é mais provável porque a class ImageProgress não possui um construtor padrão (no-arg). Isso é exigido do JAXB.

Uma maneira de depurar coisas como essa é criar um ExceptionMapper simples para capturar exceções que não estão mapeadas. Quando não há um mapeador, muitas vezes a exceção vai até o nível do contêiner, o que nos dá um erro genérico de 500 servidores (que na maioria das vezes é de pouca ajuda).

 @Provider public class DebugExceptionMapper implements ExceptionMapper { @Override public Response toResponse(Exception exception) { exception.printStackTrace(); return Response.serverError().entity(exception.getMessage()).build(); } } 

Então é só registrar o mapeador. Ao executar um teste simples com sua class ImageProgress , quando a exceção é lançada, o stacktrace é impresso e você pode ver a mensagem de exceção

… ImageProgress não possui um construtor padrão no-arg

Adicione esta linha de código antes da class HPCResponse :

 @XmlAccessorType(XmlAccessType.FIELD)