2

我正在为TomEE Plus 1.7.1实现一个 RESTful 服务应用程序,并使用Jettison作为默认的 json 提供程序。我的实体类有几个外观类,为它们中的每一个提供 CRUD 功能。服务门面由 netbeans 生成。

这是 POST 方法:

@POST
public void create(Course entity) {
    super.create(entity);
}

使用此方法(在数据库中创建新实例)时出现以下错误:

No message body reader has been found for request class Object, ContentType : application/json.

经过几个小时的尝试,我得到了它的工作:我只需要在方法中添加另一个参数,就像这样:

@POST
public void create(@Context Context uriInfo, Course entity) {
    super.create(entity);
}

我不明白为什么我必须添加这个 Context 参数。我不需要上下文变量,所以实际上我想删除它.​​.....

有人知道原因吗?

4

2 回答 2

1

好的,我想我找到了解决方案:

我所有的休息服务都被实现为外观类。抽象外观(所有服务的超类)有几种方法,例如:

public void create(T entity) { getEntityManager().persist(entity); }
public void edit(T entity) {getEntityManager().merge(entity);}

外观类使用这些方法:

public void create(Course entity) {
    super.create(entity);
}

public void edit(@PathParam("id") Integer id, Course entity) {
    super.edit(entity);
}

(为了更好地查看我已经删除了这里的注释)

这两种方法的区别在于,edit 方法有第二个参数“id”,因此不会覆盖超类的 edit() 方法。但是 create() 方法只有一个参数,它会导致超类方法“create()”被覆盖。我不知道为什么,但是 cxf 现在正在创建两个端点:

POST http://localhost:8080/webprog/api/course/  ->      void create(Course)           

POST http://localhost:8080/webprog/api/course/  ->      void create(Object)         

这也是我让它使用 secon 参数的原因: create() 方法不再被覆盖。

所以我现在所做的只是重命名超类中的方法,而不是在外观类中覆盖它们。

顺便说一句:所有服务类都是由 netbeans 生成器创建的......也许它有一个错误

于 2015-03-27T11:41:07.370 回答
0

这里有一些指针

  1. 确保您的类路径中有 jettison jar,CXF 会自动将 jettison 注册为 json 提供程序。
  2. @Context上下文不是强制性的,因此如果您想访问一些上下文参数,您可以添加。
  3. 对于方法创建添加媒体类型@Consumes(MediaType.APPLICATION_JSON)
  4. 最后检查你为什么得到No message body reader has been found for request class Object理想情况下你应该得到No message body reader has been found for request class Course(你的班级定义可能有一些问题)
于 2015-03-17T13:48:05.497 回答