java rest glassfish jersey

java - Error interno del servidor HTTP 500 en un programa simple basado en REST. Confundido en GET y POST mientras recibe/envĂ­a respuesta del servidor



glassfish jersey (2)

Estoy implementando una arquitectura básica de servidor cliente usando servicios REST por primera vez. Esta vez, lo hago más complicado al incluir algunas clases y servicios más con el intercambio de objetos de clase como parámetros entre el cliente y el servidor. Estoy ejecutando el servidor en ApacheTomcat7. Se está ejecutando con éxito. Cuando estoy ejecutando mi cliente, me da un error: javax.ws.rs.InternalServerErrorException: HTTP 500 Internal Server Error Intenté depurar mi código, parece que no estoy recibiendo / enviando correctamente la respuesta. Sé que no es una buena idea compartir todas las clases aquí, pero no tengo otra opción, ya que ha perdido mucho tiempo. Cualquier ayuda será apreciada. Gracias por adelantado.

La siguiente es mi clase ImageProgress. Esta clase está presente tanto en el servidor como en el 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 es la clase cuyo objeto se devolverá al cliente como respuesta del servidor. HPCResponse básicamente devolverá el objeto ImageProgress que me dará el resultado deseado.

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

La siguiente es la clase de servicio del servidor llamado HpcService que devolverá el objeto de HPCResponse como respuesta. Como puede ver, el método startAnalysing acepta el objeto de HPCInfo. La descripción de HPCInfo también se proporciona a continuación.

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

La clase HPCInfo también está en el cliente y en el servidor. Clase HPCInfo:

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

Y finalmente es mi cliente llamando al servicio HPCS.

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 es la descripción completa del error que recibo:

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)


Agregue esta línea de código antes de la class HPCResponse :

@XmlAccessorType(XmlAccessType.FIELD)


Una forma de depurar cosas como esta es crear un ExceptionMapper simple para detectar excepciones que no están asignadas. Cuando no hay un mapeador, a menudo la excepción aumentará hasta el nivel del contenedor, lo que solo nos da un error genérico del servidor 500 (que la mayoría de las veces es de poca ayuda).

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

Luego solo registra el mapeador. Al ejecutar una prueba simple con su clase ImageProgress , cuando se lanza la excepción, se imprime el seguimiento de la pila y puede ver el mensaje de excepción

... ImageProgress no tiene un constructor predeterminado sin argumentos

Tan solo agregue un constructor predeterminado (sin constructor) a la clase ImageProgress . Este es un requisito con los modelos JAXB.