我正在创建一个可以读取和写入JSON的Web服务,并且可以在不同的前端使用。 我有两个班,学生和课程。 我想讨论我在学生和课程之间的关系。 我在这两个班级之间建立了@ManyToMany关系,因为学生可以参加多个课程,多个学生可以参加一个课程。 在我的学生课上,我建立了这样的关系:
@ManyToMany
private List<Course> courses;
当然,我的课程课程也有同样的关系:
@ManyToMany(mappedBy = "courses")
private List<Student> students = new ArrayList<>();
这是(自动)映射到我的数据库,如下所示: 我有桌子
要从数据库POST和获取数据,我们为每个类使用“资源”类。 我将举例说明我为GET制作的学生课程以及有关学生的POST数据。我只会显示POST方法,因为这是与此事项最相关的方法
@Path("Students")
@Transactional
public class Students {
@PersistenceContext
private EntityManager em;
@Resource
private Validator validator;
@Context
private SecurityContext context;
//GET, PUT and DELETE methods
@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response addStudent(Student student) {
Set<ConstraintViolation<Student>> violations = validator.validate(student);
if (!violations.isEmpty()) {
StringBuilder errorMessage;
errorMessage = new StringBuilder();
for (ConstraintViolation<Student> violation : violations) {
if (errorMessage.length() != 0) {
errorMessage.append(", ");
}
errorMessage.append(violation.getMessage());
}
errorMessage.append(". ");
return Response.status(Response.Status.BAD_REQUEST).entity("A new student must have a username, password, firstname and lastname. These fields cannot be empty." + errorMessage).build();
}
student.encryptPassword(); //this is a method in the Student class that encrypt the password and stores it in the DB this way for safety.
student.addRole("student");
em.persist(student);
return Response.status(Response.Status.CREATED).location(URI.create("/" + student.getUsername())).build();
}
这用于将使用JSON的对象POST到数据库。 我还有一个读取传入JSON的类。此类POST方法会自动选择此类,因为它会搜索我创建的每个JSONReader类,以查看哪个类可以读取传入的JSON。
这个JSONReader类看起来像这样:
@Provider
@Consumes(MediaType.APPLICATION_JSON)
public class StudentReader implements MessageBodyReader<Student>
{
@Override
public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType)
{
return Student.class.isAssignableFrom(type);
}
@Override
public StudentreadFrom(Class<Student> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, String> httpHeaders, InputStream entityStream) throws IOException, WebApplicationException
{
JsonReader reader = Json.createReader(entityStream);
JsonObject jsonStudent = reader.readObject();
Student student = new Student();
JsonString jsonString = jsonStudent.getJsonString("firstname");
if (jsonString != null) {
student.setFirstname(jsonString.getString());
}
JsonString jsonLastname = jsonStudent.getJsonString("lastname");
if (jsonLastname != null)
{
student.setLastname(jsonLastname.getString());
}
JsonString jsonUsername = jsonStudent.getJsonString("username");
if (jsonUsername != null)
{
student.setUsername(jsonUsername.getString());
}
JsonString jsonPassword = jsonStudent.getJsonString("password");
if (jsonPassword != null)
{
student.setPassword(jsonPassword.getString());
}
return student;
}
对不起长篇大论,但我很无奈。 我找不到任何使用这种方式创建Web服务的示例或API,也找不到任何关于如何访问具有ManyToMany关系但不是由java类创建的DB表的正确示例。