Как сделать HTTP-запрос с JAX-RS API, используя Джерси? - PullRequest
0 голосов
/ 31 августа 2018

Я хочу сделать HTTP-запрос с JAX-RS API, используя Джерси.

Мой код клиента:

import javax.ws.rs.client.*;
import javax.ws.rs.core.*;
import messages.Auftrag;

public class HalloWeltTestClient {

    static Client c = ClientBuilder.newClient();

    public static void main(String[] args) {
        System.out.println("\nAuftrag-Ausgabe:");

        listeEinenAuftrag();
    }

    public static void listeEinenAuftrag() {

        Response response = c.target("http://localhost:4434/helloworld/Auftrag/{id}")
                .resolveTemplate("id", 1)
                .request(MediaType.APPLICATION_XML)
                .get();

        if (response.getStatus() == 200) {
            System.out.println("Response: " + response.readEntity(String.class));
        }

        System.out.println(response.getStatus());
        c.close();
    }
}

Код API выглядит так:

import javax.ws.rs.*;
import javax.ws.rs.core.GenericEntity;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import messages.Auftrag;

@Path( HalloWeltWebservices.webContextPath )

public class HalloWeltWebservices
{
   public static final String webContextPath = "/helloworld";

   @GET
   @Path ("/Auftrag/{id}")
   @Produces( MediaType.APPLICATION_XML )
   public Response zeigeAuftrag( @PathParam("id") int id )
   {
       Auftrag auftrag = new Auftrag();
       auftrag.setId(1);
       auftrag.setNr(1);
       auftrag.setAuftragsname("Einrichtung");

       GenericEntity<Auftrag> entity = new GenericEntity<Auftrag>(auftrag, messages.Auftrag.class);

       return Response
               .ok()
               .entity(entity)
               .build();
   }
}

Я хочу иметь структуру XML в соответствии с этим классом

Auftrag.class:

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "auftrag")
public class Auftrag {

    private int id;
    private int nr;
    private String Auftragsname;

    public Auftrag() {

    }

    public Auftrag(int id, int nr, String auftragsname) {
        super();
        this.id = id;
        this.nr = nr;
        Auftragsname = auftragsname;
    }


    public int getId() {
        return id;
    }

    @XmlAttribute
    public void setId(int id) {
        this.id = id;
    }

    public int getNr() {
        return nr;
    }

    @XmlElement
    public void setNr(int nr) {
        this.nr = nr;
    }

    public String getAuftragsname() {
        return Auftragsname;
    }

    @XmlElement
    public void setAuftragsname(String auftragsname) {
        Auftragsname = auftragsname;
    }

}

Я получаю этот результат:

enter image description here

Все, что я хочу сделать, это сделать HTTP-GET похожим на "http://localhost:4434/helloworld/Auftrag/1", и я хочу получить результат в XML как:

<auftrag id=1>
 <nr>1</nr>
 <auftragsname>Einrichtung</auftragsname>
</auftrag>

Как я могу решить это?


EDIT

Я изменил метод listeEinenAuftrag() на этот:

public static void listeEinenAuftrag() {

        try {

        Response response = c.target("http://localhost:4434/helloworld/Auftrag/{id}")
                .resolveTemplate("id", 1)
                .request(MediaType.APPLICATION_XML)
                .get();

        if (response.getStatus() == 200) {
            System.out.println("Response: " + response.readEntity(String.class));
        }

        System.out.println(c.target("http://localhost:4434/helloworld/Auftrag/{id}")
                .resolveTemplate("id", 1)
                .request(MediaType.APPLICATION_XML)
                .get());
        c.close();

    } catch(Exception ex){

        DebugExceptionMapper m = new DebugExceptionMapper();
        m.toResponse(ex);
    }

Кроме того, я добавил класс DebugExceptionMapper:

@Provider
public class DebugExceptionMapper implements ExceptionMapper<Exception> {

    @Override
    public Response toResponse(Exception exception) {
        exception.printStackTrace();
        return Response.serverError().entity(exception.getMessage()).build();
    } 
}

Но программа не выдает никаких исключений, я все равно получаю Http-статус 500. Что я делаю не так?


РЕДАКТИРОВАТЬ № 2

Моя структура пакета выглядит следующим образом:

пакетное сообщение - Auftrag.java

пакет testVerb - HalloWeltTestClient.java - HalloWeltTestServer.java

пакет веб-сервисов - HalloWeltWebservices.java


РЕДАКТИРОВАТЬ № 3

Я изменил код сервера на это:

import java.io.IOException;
import java.net.URI;
import org.glassfish.grizzly.http.server.HttpServer;
import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory;
import org.glassfish.jersey.server.ResourceConfig;

public class HalloWeltTestServer {

    public static String baseUrl = "http://localhost:4434";

    public static void main(String[] args) throws IOException, InterruptedException {

        ResourceConfig resourceConfig = new ResourceConfig(webservices.HalloWeltWebservices.class);

        resourceConfig.register(DebugExceptionMapper.class);

        final HttpServer server = GrizzlyHttpServerFactory.createHttpServer(URI.create(baseUrl), resourceConfig, false);

        Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
            public void run() {
                server.shutdownNow();
            }
        }));

        try {

            server.start();

            System.out.println(String.format(
                    "\nGrizzly-HTTP-Server gestartet mit der URL: %s\n"
                            + "Stoppen des Grizzly-HTTP-Servers mit:      Strg+C\n",
                    baseUrl + webservices.HalloWeltWebservices.webContextPath));

        } catch (Exception ex) {
            ex.printStackTrace();
        }

        try {

            Thread.currentThread().join();
            server.shutdown();

        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

Результат:

enter image description here


РЕДАКТИРОВАТЬ № 4

Может ли быть, что файл web.xml вызывает эту проблему?

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         id="WebApp_ID" version="2.5">
  <display-name>REST</display-name>
  <servlet>
    <servlet-name>REST-Servlet</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
      <param-name>jersey.config.server.provider.packages</param-name>
      <param-value>TestVerb.TestVerb;webservices;messages</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>REST-Servlet</servlet-name>
    <url-pattern>/rest/*</url-pattern>
  </servlet-mapping>
</web-app>

РЕДАКТИРОВАТЬ № 5

После того, как я изменил метод listeEinenAuftrag() на этот:

public static Auftrag listeEinenAuftrag() {

        WebTarget wTarget = c.target("http://localhost:4434/helloworld/Auftrag/{id}");

        Invocation.Builder invocationBuilder = wTarget.resolveTemplate("id", 1).request(MediaType.TEXT_XML);

        Response response = invocationBuilder.get();

        return response.readEntity(Auftrag.class);
}

Я получил исключение:

Exception in thread "main" org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyReader not found for media type=text/html;charset=ISO-8859-1, type=class messages.Auftrag, genericType=class messages.Auftrag.
    at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:232)
    at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:156)
    at org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:1091)
    at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:874)
    at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:808)
    at org.glassfish.jersey.client.ClientResponse.readEntity(ClientResponse.java:321)
    at org.glassfish.jersey.client.InboundJaxrsResponse$1.call(InboundJaxrsResponse.java:115)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:316)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:298)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:229)
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:389)
    at org.glassfish.jersey.client.InboundJaxrsResponse.runInScopeIfPossible(InboundJaxrsResponse.java:264)
    at org.glassfish.jersey.client.InboundJaxrsResponse.readEntity(InboundJaxrsResponse.java:112)
    at TestVerb.TestVerb.HalloWeltTestClient.listeEinenAuftrag(HalloWeltTestClient.java:29)
    at TestVerb.TestVerb.HalloWeltTestClient.main(HalloWeltTestClient.java:15)

Как я могу решить эту проблему?

...