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

JSON deserialize only with at least 2 parameters

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

有人知道原因吗?

这里有一些建议

  1. 确保您的 class 路径中有 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(你的 class 定义可能有一些问题)

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

我所有的其余服务都已作为外观 classes 实现。抽象外观(所有服务的超级class)有几个方法,如:

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

这些方法被门面使用classes:

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

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

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

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

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

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

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

所以我现在所做的就是简单地重命名 de super class 中的方法,而不是在 facade classes 中覆盖它们。

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