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.