如何使用Jersey使用JAX-RS API发出HTTP请求?

时间:2018-08-31 10:32:19

标签: java http jax-rs jersey-2.0 jersey-client

我想使用Jersey使用JAX-RS API发出HTTP请求。

我的客户代码是:

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>

我该如何解决?


编辑

我将方法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-status500。我在做什么错了?


编辑2号

我的包裹结构如下:

打包消息-Auftrag.java

软件包testVerb-HalloWeltTestClient.java                  -HalloWeltTestServer.java

软件包web服务-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)

我该如何解决?

0 个答案:

没有答案