Pra*_*nth 5 java rest jersey jersey-client jersey-2.0
我使用Jersey2编写了一个示例REST服务.
这是我的web.xml:
<web-app>
<display-name>jerseysample</display-name>
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.adaequare.rest.config.JerseyResourceInitializer</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
Run Code Online (Sandbox Code Playgroud)
这是我的示例类:
package com.adaequare.resource;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("/hello")
public class Hello {
@GET
@Produces(MediaType.TEXT_HTML)
public String sayHtmlHello(){
return "<html><title>Hello Jersey</title><body><h1>Hello Jersey</h1></body></html>";
}
@GET
@Produces(MediaType.TEXT_PLAIN)
public String sayPlainTextHello() {
return "Hello Jersey";
}
// This method is called if XML is request
@GET
@Produces(MediaType.TEXT_XML)
public String sayXMLHello() {
return "<?xml version=\"1.0\"?>" + "<hello> Hello Jersey" + "</hello>";
}
}
Run Code Online (Sandbox Code Playgroud)
我已将其部署到Tomcat,并且能够访问以下URL:
http://localhost:8080/jerseysample/rest/hello
Run Code Online (Sandbox Code Playgroud)
我尝试用这种方式编写单元测试:
package com.adaequare.client;
public class MyResourceTest {
public static final URI BASE_URI = UriBuilder.fromUri("http://localhost").port(8080).build();
private HttpServer server;
private WebTarget target;
@Before
public void setUp() throws Exception {
ResourceConfig rc = new ResourceConfig(Hello.class);
server = GrizzlyHttpServerFactory.createHttpServer(BASE_URI, rc);
server.start();
Client c = ClientBuilder.newClient();
target = c.target(BASE_URI);
}
@After
public void tearDown() throws Exception {
server.shutdownNow();
}
@Test
public void testGetIt() {
String responseMsg = target.path("jerseysample").path("rest").path("hello").request().get(String.class);
System.out.println("I am here");
assertEquals("Got it!", responseMsg);
}
}
Run Code Online (Sandbox Code Playgroud)
这个类也抛出异常.
在执行此类时,我收到以下异常:
Exception in thread "main" javax.ws.rs.NotFoundException: HTTP 404 Not Found
at org.glassfish.jersey.client.JerseyInvocation.convertToException(JerseyInvocation.java:917)
at org.glassfish.jersey.client.JerseyInvocation.translate(JerseyInvocation.java:770)
at org.glassfish.jersey.client.JerseyInvocation.access$500(JerseyInvocation.java:90)
at org.glassfish.jersey.client.JerseyInvocation$2.call(JerseyInvocation.java:671)
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:423)
at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:667)
at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:396)
at org.glassfish.jersey.client.JerseyInvocation$Builder.get(JerseyInvocation.java:296)
at com.adaequare.client.TestClient.main(TestClient.java:14)
Run Code Online (Sandbox Code Playgroud)
我确信我错过了一些配置.我曾经浏览过这个问题的根本原因,但无济于事.如果我错过了什么,有人可以告诉我吗?
您的服务被映射到(并且您说您可以访问它):http://localhost:8080/jerseysample/rest/hello但是使用您正在调用的客户端http://localhost:8080/restserver/rest/hello是不同的 URL。有什么惊喜呢?
尝试
WebTarget target = ClientBuilder.newClient().target("http://localhost:8080/jerseysample/rest/").path("hello");
Run Code Online (Sandbox Code Playgroud)
至于第二个测试,尝试在 WebTarget 上调用 getUri() 来查看您实际调用的 URL,它应该可以帮助您找出问题所在。
更新后:
首先,您尚未指定(在内容协商方面)您的客户接受哪些内容(您在之前的示例中执行了此操作,并将其删除)。但这不应该是一个问题,因为在这种情况下,服务器应该向您发送任何已实现的响应,因为如果不指定它,您就表明您支持所有类型的响应。但问题可能出在方法String.class上get()。应该有一个您希望 Jersey 将响应转换为的实体。如果你想得到字符串我会做这样的事情:
Response response = target.path("jerseysample").path("rest").path("hello").
request().get();
StringWriter responseCopy = new StringWriter();
IOUtils.copy((InputStream) response.getEntity(), responseCopy);
Run Code Online (Sandbox Code Playgroud)
但是您无法确定将调用三个方法中的哪一个,因为它位于同一路径上,因此您还应该通过将内容传递给request方法来指定内容。
| 归档时间: |
|
| 查看次数: |
28152 次 |
| 最近记录: |