将@Produces用于不同的方法

时间:2015-07-20 17:34:32

标签: java web-services jersey

我正在学习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客户端测试的方式:

enter image description here

1 个答案:

答案 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通常是人类可读的。