我使用的JAX-RS web服务的球衣执行。 我是很新的这JAX-RS。
我试图在接受Employee对象,并根据Employee对象的值返回雇员ID的服务中添加方法(有一个DB打这个)。
继宁静的原则,我做的方法,@GET,如图所示下面提供的网址路径:
@Path("/EmployeeDetails")
public class EmployeeService {
@GET
@Path("/emp/{param}")
public Response getEmpDetails(@PathParam("param") Employee empDetails) {
//Get the employee details, get the db values and return the Employee Id.
return Response.status(200).entity("returnEmployeeId").build();
}
}
出于测试目的,我写了这个客户端:
public class ServiceClient {
public static void main(String[] args) {
ClientConfig config = new DefaultClientConfig();
Client client = Client.create(config);
WebResource service = client.resource(getBaseURI());
Employee emp = new Employee();
emp.name = "Junk Name";
emp.age = "20";
System.out.println(service.path("rest").path("emp/" + emp).accept(MediaType.TEXT_PLAIN).get(String.class));
}
private static URI getBaseURI() {
return UriBuilder.fromUri("http://localhost:8045/AppName").build();
}
}
当我运行它,我得到的错误: Method, public javax.ws.rs.core.Response com.rest.EmployeeService.getEmpDetails(com.model.Employee), annotated with GET of resource, class com.rest.EmployeeService, is not recognized as valid resource method.
编辑:
模型:
package com.model;
public class Employee {
public String name;
public String age;
}
请让我知道什么地方的问题,我在这是一个初学者,并努力理解这些概念:(
JAX-RS不能自动转换@PathParam(它是一个字符串值),放入一个Employee
对象。 可以从@PathParam自动创建的对象的要求是:
- 字符串(事实上的,因为数据已经是一个字符串)
- 与接受(单个)字符串作为参数的构造对象
- 与静态对象
valueOf(String)
方法
对于例2和3的对象会需要分析该字符串数据和填充其内部的状态。 这不是正常进行(因为它迫使你做出假设有关内容类型的数据)。 对于你的情况(刚开始学习JAX-RS),其最好只接受传入@PathParam数据作为一个String(或整数,或长)。
@GET
@Path("/emp/{id}")
public Response getEmpDetails(@PathParam("id") String empId) {
return Response.status(200).entity(empId).build();
}
在GET方法传递一个复杂的对象表示到REST服务没有多大意义的,除非它被使用,例如,作为搜索过滤器。 根据您的反馈,那是你正在尝试做的。 我其实之前(通用实现搜索过滤器),一个项目做到了这一点,一个忠告是,你需要严格定义搜索数据的格式。 所以,让我们定义JSON作为接受的格式(可以根据需要的例子适应其他格式)。 “搜索对象”将被传递到服务作为所谓的查询参数filter
。
@GET
@Path("/emp")
public Response getEmployees(@QueryParam("filter") String filter) {
// The filter needs to be converted to an Employee object. Use your
// favorite JSON library to convert. I will illustrate the conversion
// with Jackson, since it ships with Jersey
final Employee empTemplate = new ObjectMapper().readValue(filter, Employee.class);
// Do your database search, etc, etc
final String id = getMatchingId(empTemplate);
// return an appropriate response
return Response.status(200).entity(id).build();
}
而在你的客户端类:
final String json = new ObjectMapper().writeValueAsString(emp);
service
.path("rest")
.path("emp")
.queryParam("filter", json)
.accept(emp, MediaType.TEXT_PLAIN)
.get(String.class)
我得到了相同的问题,但我只是固定在你的应用程序中使用应该有相同版本的球衣罐子。
这是要序列化的实体(员工)到URL路径段很奇怪。 我不是说这是不可能的,但奇怪的,然后你必须确保该Employee
类满足以下条件(这是从的javadoc的 @PathParam
)
类型注释参数,字段或属性必须要么的:
...(不相关的部分)
必须能够接受一个字符串参数的构造函数。
有一个名为的valueOf或fromString静态方法接受单个字符串参数(参见,例如,Integer.valueOf(字符串))。
你可能想通过Employee
在请求主体raher对象不是在路径PARAM。 为了chieve此,注释Employee
带班@XmlRootElement
,取出@PathParam
从方法的注释empDetails
说法,并改变@GET到@POST。
文章来源: JAX-RS exception: Annotated with GET of resource, class is not recognized as valid resource method