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 参数。我不需要上下文变量,所以实际上我想删除它...
有人知道原因吗?
这里有一些建议
- 确保您的 class 路径中有 jettison jar,CXF 会自动将 jettison 注册为 json 提供程序。
@Context
上下文不是强制性的,所以如果你想访问一些上下文参数,你可以添加。
- 对于方法创建添加媒体类型
@Consumes(MediaType.APPLICATION_JSON)
- 最后检查你为什么得到
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 生成器创建的...也许其中有一个错误
我正在为 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 参数。我不需要上下文变量,所以实际上我想删除它...
有人知道原因吗?
这里有一些建议
- 确保您的 class 路径中有 jettison jar,CXF 会自动将 jettison 注册为 json 提供程序。
@Context
上下文不是强制性的,所以如果你想访问一些上下文参数,你可以添加。- 对于方法创建添加媒体类型
@Consumes(MediaType.APPLICATION_JSON)
- 最后检查你为什么得到
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 生成器创建的...也许其中有一个错误