Problema Testeando un REST con JSON en NetBeans y GlassFish Server

Realizando el test de una aplicación REST que había desarrollado para mi curso de Desarrollo de Sistemas Distribuidos en la UPC me di con un problema que me tomo un par de horas solucionar.

A continuación detallo el problema y la solución que me permitió descansar por fin tranquilo y terminar mi aplicación REST.

Ambiente:

NetBeans IDE 8.2
GlassFish Server 4.1.2
J2EE 7

Al ejecutar el Test File de mi aplicación REST:


Me salió el siguiente error que figuraba en el LOG del Server:

javax.ws.rs.InternalServerErrorException: HTTP 500 Internal Server Error at org.glassfish.jersey.client.JerseyInvocation.convertToException(JerseyInvocation.java:1020) at org.glassfish.jersey.client.JerseyInvocation.translate(JerseyInvocation.java:816) at org.glassfish.jersey.client.JerseyInvocation.access$700(JerseyInvocation.java:92) at org.glassfish.jersey.client.JerseyInvocation$2.call(JerseyInvocation.java:700) 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:444) at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:696) at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:420) at org.glassfish.jersey.client.JerseyInvocation$Builder.get(JerseyInvocation.java:316) at test.rest.TestReportResource.testGetProjectManagersRestJersey(TestReportResource.java:104) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)

Lo raro que si vemos el código con detenimiento:

    @Test
    public void testGetResultados() {
        Client client = ClientBuilder.newClient();
        WebTarget webTarget = client.target("http://localhost:8080/ChampionsWS/webresources").path("champions");
        String resp = webTarget.request(MediaType.APPLICATION_XML).get(String.class);
        System.out.println("------- XML GET ---------");
        System.out.println(resp);
        resp = webTarget.request(MediaType.APPLICATION_JSON).get(String.class);
        System.out.println("----- JSON GET -----------");
        System.out.println("Resp:" + resp);
    }

Lo que hago en este código es que al hacer el pedido REST le digo que me retorne en formato XML y después en formato JSON, el problema solo se daba con el segundo escenario. Si comentaba el código del segundo escenario todo salía bien.

Entonces supuse que el problema era al momento de convertir la respuesta de mi REST a JSON y además de que esto sucedía en el GlassFish Server.

Así que luego de googlear y navegar por diversas paginas y probar sus diversas soluciones me encontré con este link y resulto (para mi suerte y ya pestañeando por la madrugada) ser el remedio a mi problema:

https://stackoverflow.com/questions/33722764/glassfish-error-when-producing-json

Aunque tuve que hacer algunos cambios que detallo en orden:

  • Parar el Glassfish Server en mi NetBeans.


  • Ir al directorio donde se encuentra instalado el GlassFish Server que se estaba ejecutando en el NetBeans. Y dentro de este directorio ir a \glassfish\modules y ubicar el archivo org.eclipse.persistence.moxy.jar.


  • Aquí hay que abrir el archivo con el WINRAR y extraer el archivo MANIFEST.MF para modificarlo:

  • Agregar en la parte del Import-Package el siguiente texto:
,org.xml.sax.helpers,javax.xml.parsers;resolution:=optional,javax.naming;resolution:=optional
  • Es decir al final el archivo lucirá así:

  • Una vez modificado el archivo reemplazarlo en el JAR y listo.
  • Volver a Iniciar el GlassFish Server en el NetBeans y ejecutar el Test.

Comentarios