我正在学习Jersey webservices
并遇到@Produces
的用法,所以为了理解它,我写了一个这样的小程序:
@Path("users/{username: [a-zA-Z][a-zA-Z_0-9]*}")
public class UserResource {
@GET
@Produces("text/plain")
public String getUser(@PathParam("username") String userName) {
return "Hello " + userName;
}
@GET
@Produces({"application/xml", "application/json"})
public String doGetAsXmlOrJson(@PathParam("username") String userName) {
return "<text>Hello World</text>";
}
}
当我将请求作为http://localhost:9998/users/Java
传递,并且标题为“Accept:application / json”时,我希望输出为<text>Hello World</text>
。但我没有把它作为Hello Java
。我正在使用Chrome浏览器的Postman客户端对此进行测试。
现在,如果我删除上述程序中的getUser
方法,则输出为<text>Hello World</text>
。
您能否告诉我为什么即使我设置了Accept标头,请求也不会转到我的doGetAsXmlOrJson
方法?
更新:添加更多详情 -
使用Jersey documentation中提到的以下代码部署程序:
import java.io.IOException;
import java.net.URI;
import javax.ws.rs.core.UriBuilder;
import org.glassfish.grizzly.http.server.HttpServer;
import com.sun.jersey.api.container.grizzly2.GrizzlyServerFactory;
import com.sun.jersey.api.core.PackagesResourceConfig;
import com.sun.jersey.api.core.ResourceConfig;
public class Main {
private static URI getBaseURI() {
return UriBuilder.fromUri("http://localhost/").port(9998).build();
}
public static final URI BASE_URI = getBaseURI();
protected static HttpServer startServer() throws IOException {
System.out.println("Starting grizzly...");
ResourceConfig rc = new PackagesResourceConfig("com.examples.Jersey1");
return GrizzlyServerFactory.createHttpServer(BASE_URI, rc);
}
public static void main(String[] args) throws IOException {
HttpServer httpServer = startServer();
System.out.println(String.format("Jersey app started with WADL available at "
+ "%sapplication.wadl\nTry out %shelloworld\nHit enter to stop it...",
BASE_URI, BASE_URI));
System.in.read();
httpServer.stop();
}
}
这就是我使用Postman客户端测试的方式:
答案 0 :(得分:0)
我不知道你可以拥有2&#34; @ GET&#34;对于相同的@Path。我想人们可以假设球衣会将其路由到基于&#34的正确方法;接受&#34;报头中。
我知道这是一个测试,但我不知道对象的文本表示有多大用处。
这是我使用@Produces的方式和时间
通常,我的Web服务将提供XML或JSON。 根据客户端的偏好(使用accept标头),任何典型的服务都会根据你的doGetAsXmlOrJson方法生成两者
您不需要自己生成XML或JSON,只需返回POJO,Jersey将使用Jackson或Moxy(或者您最喜欢的泽西配置的JSON / XML提供程序)为您转换它,根据您的&#34;输出JSON或XML,接受&#34;头。
有时,某些服务可能会返回图像,pdf,甚至文本:) ...在这些特殊情况下,我使用@Produces的其他可能值...
但是我从来没有添加过我需要自动JSON / XML编组或文本的情况。我想它可能对调试有用,但JSON和XML通常是人类可读的。