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

时间:2015-10-22 13:15:36

标签: java json rest netbeans

我不熟悉从Netbeans 8中的数据库自动生成REST服务代码。

  

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

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

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

换句话说,假设我执行GET ../student/12,我想要获得的是:

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

祝你好运

1 个答案:

答案 0 :(得分:0)

所以看起来我的工作正常,但我不知道这是否是最优雅的方式。

这就是我的所作所为。

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

@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方法。

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

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

编辑2:我明白了。对于&#34;一般延伸&#34;服务上面我答案的第一部分是好的。但是,如果要获取已在数据库中映射为关系的集合的序列化,只需正确删除实体自动生成的类中的相对@XmlTransient注释。注意避免循环引用,也就是说,您可能需要添加 @XmlTransient注释到&#34; getParent()&#34; 方法在子实体类中。 对于这个例子: (A)转到Student实体类并从@XmlTransient方法中删除getExamsCollection()注释; (B)转到Exam实体类,然后添加 @XmlTransient注释到getStudent()方法。

希望这有帮助。

祝你好运