如何使用@PathParam?

时间:2012-10-22 07:18:12

标签: json java-ee jax-rs

我正在遵循教程的简单步骤,直到现在我无法弄清楚它显示错误的原因。

我正在尝试使用简单的JAX-RS应用程序返回简单的JSON。 以下是我的代码和web.xml设置:

package ws;

import javax.ws.rs.core.Context;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.PathParam;
import javax.ws.rs.Consumes;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.GET;
import javax.ws.rs.Produces;

@Path("/employee/{empno}")
public class EmployeeResource {

    @Context
    private UriInfo context;

    public EmployeeResource() {
    }

    @GET
    @Produces("application/json")
    public String getJson( @PathParam("empno") int empno) {
      switch(empno) {
          case 1 :
              return "{'name':'George Koch', 'age':58}";
          case 2:
              return "{'name':'Peter Norton', 'age':50}";
          default:
              return "{'name':'unknown', 'age':-1}";
      }
    }

    @PUT
    @Consumes("application/json")
    public void putJson(String content) {
    }
}

web.xml如下:

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://java.sun.com/xml/ns/javaee"  
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
           http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">
    <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>ws</param-value>
      </init-param>
      <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
      <servlet-name>Jersey REST Service</servlet-name>
      <url-pattern>/resources/*</url-pattern>
    </servlet-mapping>

    <session-config>
      <session-timeout>30</session-timeout>
    </session-config>
  </web-app>

然后我使用地址:

localhost:8084/restdemo/resources/employee/empno=1

但它显示404错误。

1 个答案:

答案 0 :(得分:4)

呼叫

localhost:8084/restdemo/resources/employee/1

@PathParam不是@QueryParam。它的名称来源于它在查询路径中的位置,而不是像empno=1这样的名称。由于您的@Path

@Path("/employee/{empno}")

位于{empno}位置的网址路径元素会自动分配到您的@PathParam empno

修改

如果您想调用类似

的网址
localhost:8084/restdemo/resources/employee?empno=1

你必须使用

@Path("/employee")
public String getJson(@QueryParam("empno") int empno) 

请注意?,它是其左侧的网址路径与其右侧的查询之间的边界。

<强>提示:

您的JSON无效。您必须使用双引号"而不是单引号'

return "{\"name\":\"George Koch\", \"age\":58}";