为webservice的根路径使用不同的mediatype

时间:2012-07-28 23:06:10

标签: java web-services rest jersey

我有以下代码

@Path("/hello")
public class Hello {

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    @Consumes(MediaType.TEXT_XML)
    public String sayPlainTextHello(@Context UriInfo wsContext) 
    {
        return "hello from xml";
    }
}

这将产生路径http://localhost:8080/WSTest/rest/hello。现在我想要有两种不同的方法,以便当用户调用http://localhost:8080/WSTest/rest/hello.xml时,它转到XML方法,当它调用http://localhost:8080/WSTest/rest/hello.json时,它转到JSON方法。使用当前实现,如果我在路径末尾添加.xml.json,服务器将返回not found错误。

修改 这是我的web.xml。请注意,如果添加子路径,请说@Path("{name}.xml"),这意味着web.xml没问题。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 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>WSTest</display-name>
  <servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
      <param-name>com.sun.jersey.config.property.packages</param-name>
      <param-value>com.personal.ws.test</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>

P.S: 我无法更改路径,我们希望将根路径保持为http://localhost:8080/WSTest/rest/hello

2 个答案:

答案 0 :(得分:0)

您需要在方法中添加@Path注释:

@Path("/rest")
public class Hello {

    @Path("/hello.xml")
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    @Consumes(MediaType.TEXT_XML)
    public String sayXmlHello(@Context UriInfo wsContext) {
        return "hello from xml";
    }

    @Path("/hello.json")
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    @Consumes(MediaType.APPLICATION_JSON)
    public String sayJsonHello(@Context UriInfo wsContext) {
        return "hello from json";
    }
}

答案 1 :(得分:0)

您可以通过让客户端请求正确的编码来建议@Ali。

您可以通过添加扩展程序支持来扩充此功能。这样,无法设置所需响应格式(无论出于何种原因)的Web浏览器和客户端仍可以切换媒体类型。您可以通过扩展PackagesResourceConfig来完成此操作:

public class CommonResourceConfig extends PackagesResourceConfig {

  public CommonResourceConfig(Map<String, Object> props) {
    super(props);
  }

  public CommonResourceConfig(String... packages) {
    super(packages);
  }

  @Override
  public Map<String, MediaType> getMediaTypeMappings() {
    Map<String, MediaType> map = new HashMap<String, MediaType>();
    map.put("xml", MediaType.APPLICATION_XML_TYPE);
    map.put("json", MediaType.APPLICATION_JSON_TYPE);
    return map;
  }
}

然后告诉Jersey通过将javax.ws.rs.Application属性设置为该类的完全限定名称来查找此配置(除非您使用某些DI机制,否则在您的web.xml中)。此外,您还需要更新方法上的@Produces注释,以支持您要处理的所有媒体类型。这样,您不必在方法之间复制功能,只需更改服务的媒体类型。

修改 Hello.java与您完全一样,CommonResourceConfig如上所述(全部在src/main/java/com/personal/ws/test/)。这是我的配置的其余部分(至少在本地):

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.example</groupId>
    <artifactId>jersey</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>
    <name>jerseyTest</name>

    <build>
        <plugins>
            <plugin>
                <groupId>org.mortbay.jetty</groupId>
                <artifactId>jetty-maven-plugin</artifactId>
                <version>8.0.3.v20111011</version>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-server</artifactId>
            <version>1.13</version>
        </dependency>
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-json</artifactId>
            <version>1.13</version>
        </dependency>
        <dependency>
            <groupId>com.sun.jersey.contribs</groupId>
            <artifactId>jersey-guice</artifactId>
            <version>1.13</version>
        </dependency>
    </dependencies>
</project>

src/main/webapp/WEB-INF/web.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">
    <display-name>WSTest</display-name>

    <servlet>
        <servlet-name>Jersey REST Service</servlet-name>
        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>com.sun.jersey.config.property.packages</param-name>
            <param-value>com.personal.ws.test</param-value>
        </init-param>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>com.personal.ws.test.CommonResourceConfig</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>

运行mvn jetty:run,然后忘记或使用http://localhost:8080/rest/hello.jsonhttp://localhost:8080/rest/hello.xml的浏览器。我得到了正确的结果......可能只是一些小配置问题?