我有以下代码
@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
。
答案 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.json
和http://localhost:8080/rest/hello.xml
的浏览器。我得到了正确的结果......可能只是一些小配置问题?