JSON仅使用至少2个参数进行反序列化

时间:2015-03-16 17:25:00

标签: java cxf jax-rs tomee jettison

我正在为 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参数。我不需要上下文变量,所以实际上我想删除它.​​..

有人知道原因吗?

2 个答案:

答案 0 :(得分: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);
}

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

这两种方法的区别在于,编辑方法有第二个参数" 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()方法不再被覆盖。

所以我现在所做的只是在de super类中重命名方法,而不是在facade类中重写它们。

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

答案 1 :(得分:0)

以下是一些指针

  1. 确保您的类路径中有放弃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(你的课堂定义可能存在一些问题)