我想使用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;
}
}
我得到这个结果:
我要做的就是,要使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();
}
}
}
结果:
编辑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)
我该如何解决?