2017-07-18 25 views
0

我通过Jax-RSCXF实现了一个休息Web服务。静止服务的输入参数中的固定名称

@Path("/StudentServices") 
@Produces({"application/json"}) 
public class Student 
{ 
    @POST 
    @Path("/save") 
    public String persist(@QueryParam("StudentName") String name, 
          @QueryParam("StudentAge") String age) 
    { 
     System.out.println("*******************************"); 
     System.out.println(" Incomming student with = " + name + " " + age); 
     System.out.println("*******************************"); 
     return "Hello " + name; 
    } 
} 

其实,我要打电话与网址的服务:localhost:9000/StudentServices/save 并与主体消息JSON:{ “StudentName”: “约翰”, “StudentAge”: “30”}

但是当请求到达persist方法时,其输入为空或空。我用其他方式进行了检查,如Jackson注释,JAXB注释但没有人正常工作。

此外,我想修复参数的名称,当我的服务有输入基元类型和字符串,因为当我使用一个类输入时,它工作正常。

回答

1

您正在将参数定义为QueryParam这意味着JAX-RS期望它们作为参数添加到您的url中,例如, localhost:9000/StudentServices/save?StudentName=John&StudentAge=30

你想要的是数据是在正文中发送的。所以,你可以定义一个简单的POJO:

public class Student { 
    private String StudentName; 
    private int StudentAge; 

    // getters and setters 
} 

而在JAX-RS的方法把它作为参数:

@POST 
@Path("/save") 
public String persist(Student student) { 
    System.out.println("*******************************"); 
    System.out.println(" Incomming student with = " + student.getStudentName() + " " + student.getStudentAge()); 
    System.out.println("*******************************"); 
    return "Hello " + student.getStudentName(); 
} 

JAXB提供者正在改变你的身体数据(JSON)到相应的POJO和你可以通过getters访问数据。

+0

谢谢。你的意思是没有别的办法定义POJO? – MJM

+0

您可以使用'javax.json.JsonObject'作为泛型类:'public String persist(JsonObject data)',并通过使用其诸如'.getString(“StudentName”)''的方法之一来访问数据以获取JSON数据为StudentName作为字符串。 –

+0

我无法使用公共'String persist(JsonObject数据)',因为当我发送请求时,服务器抛出一个异常:'javax.ws.rs.WebApplicationException:HTTP 415 Unsupported Media Type'。我的方法签名是:'@POST @Path(“/ call2”) public void call(javax.json。JsonObject json)' – MJM

2

您不能使用@QueryParam来读取请求的主体。

正如@QueryParam文档中所述,它将HTTP查询参数的值绑定到资源方法参数,资源类字段或资源类bean属性。除非使用Encoded注释禁用了这些值,否则URL将被解码。所以,如果你将请求转发类似下面的exisiting代码应工作:

localhost:9000/StudentServices/save?StudentName=John& StudentAge=30 

现在,如果你想接受JSON请求。然后,你必须创建seprate的javaBean。

@XmlRootElement 
public class StudentRequest { 
    private String studentName; 
    private int studentAge; 

    // getter and setter 
} 

并在你的控制器。 (即学生)

@Path("/StudentServices") 
public class Student { 
@POST 
@Path("/save") 
@Produces({"application/json"}) 
public String persist(StudentRequest studentRequest) 
{ 
    //your custom logic 
} 
} 

还指定您在生产或消耗方法级别的注释。它可以灵活地从其他方法返回其他内容类型。

+0

谢谢。你的意思是没有别的办法定义POJO? – MJM