我是Netbeans 8中数据库自动生成REST服务代码的新手。
我从DB中自动生成REST服务的代码,并获得实体类和服务"facade"类。我现在需要做的是扩展/编辑这些服务,我不知道该把手放在哪里。免责声明:经过讨论(在评论中),我意识到我如果你不熟悉在Netbeans中从DB自动生成REST服务(https://netbeans.org/kb/docs/websvc/rest.html)。那是因为你需要知道发生了什么,要把手放在哪里编辑它们。我在这里没有提供任何非工作代码,而是想知道我应该做什么才能编辑这样的服务。我提供了一个我想要得到的例子。
例如,考虑以下场景。我有一个学生,他/她通过了很多考试。从数据库的角度来看,学生-考试是一对多的关系。当我测试剩下的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()
方法中。
希望对你有帮助。