我正在为 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参数。我不需要上下文变量,所以实际上我想删除它...
有人知道原因吗?
答案 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)
以下是一些指针
@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
(你的课堂定义可能存在一些问题)