如何扩展/编辑 Netbeans 自动生成的 REST 服务?



我是Netbeans 8中数据库自动生成REST服务代码的新手。

免责声明:经过讨论(在评论中),我意识到我如果你不熟悉在Netbeans中从DB自动生成REST服务(https://netbeans.org/kb/docs/websvc/rest.html)。那是因为你需要知道发生了什么,要把手放在哪里编辑它们。我在这里没有提供任何非工作代码,而是想知道我应该做什么才能编辑这样的服务。我提供了一个我想要得到的例子。

我从DB中自动生成REST服务的代码,并获得实体类和服务"facade"类。我现在需要做的是扩展/编辑这些服务,我不知道该把手放在哪里。

例如,考虑以下场景。我有一个学生,他/她通过了很多考试。从数据库的角度来看,学生-考试是一对多的关系。当我测试剩下的API并根据学生的ID执行GET时,得到的JSON不像预期的那样包含与该学生相关的考试集合。我应该在哪里以及如何更改自动生成的服务代码,以便在学生的json中获取考试集合?

换句话说,假设我对../student/12,我想得到的是:

{ 
  "id":12, "name":"Marco", "age":26, "exams": [
   { "id":1, "exam_name":"Computer Networks" },
   { "id":15, "exam_name":"Algorithms"}
  ]
}

看起来我已经搞定了,但是我不知道这是不是最优雅的方式。

我是这么做的。

1)转到自动生成的实体类(即Exam.java),并向NamedQueries注释添加自定义NamedQuery。例如,

@NamedQueries({
... default auto-generated stuff ...
@NamedQuery(name = "getExamsOfStudent", query="SELECT e FROM Exams e WHERE e.student.ID =: studentID")})

2)转到自动生成的 REST服务类(即ExamFacadeREST.java),并添加一个方法来检索父类的子,使用实体类中定义的NamedQuery。例如,

@GET
@Path("studentID/{studentID}")
@Produces({"application/xml","application/json"})
public List<Exam> getExamsOfStudent(@PathParam("studentID") Integer studentID) {  
  javax.persistence.Query query = getEntityManager().createNamedQuery("Exam.getExamsOfStudent");
  query.setParameter("studentID", studentID);
  return query.getResultList();
}
此时,您有一个REST服务,它检索父实体的子实体。

然而,这不是我最初要求的。当执行学生的GET(按id)时,我想在学生JSON中检索作为集合的考试。为了做到这一点,只需转到父实体REST服务(即StudentFacadeREST.java)并正确编辑find方法。

有谁知道更优雅的方法吗?

EDIT 1:我正在尝试第二种方法(在执行学生的GET时,在学生JSON中检索作为集合的考试),我看到该集合没有被序列化到输出JSON中。对此有什么建议吗?

编辑2:我明白了。对于"普遍扩展"一项服务,我上面回答的第一部分是好的。但是,如果您想获得已经在DB中映射为关系的集合的序列化,只需适当地删除实体自动生成类中的相对@XmlTransient注释。注意避免循环引用,也就是说,您可能需要在"getParent() "中添加一个@XmlTransient注释。方法在子实体类中。对于这个例子:(A)转到Student实体类,从getExamsCollection()方法中删除@XmlTransient注释;(B)转到Exam实体类,@XmlTransient注释添加到getStudent()方法中。

希望对你有帮助。

最新更新