Я хочу сохранить данные из запроса POST в таблицу - PullRequest
0 голосов
/ 28 апреля 2020

Я извлекаю данные из запроса POST и сохраняю в таблицу UserSubjects. Это было нормально, пока я просто сохранял, и в сущности это было "private Integer subjectId" .

UserSubjects

+-----------+---------+------+-----+---------+----------------+
| Field     | Type    | Null | Key | Default | Extra          |
+-----------+---------+------+-----+---------+----------------+
| id        | int(20) | NO   | PRI | NULL    | auto_increment |
| subjectId | int(11) | YES  | MUL | NULL    |                |
| userId    | int(11) | YES  |     | NULL    |                |
+-----------+---------+------+-----+---------+----------------+

UserSubjectsEntity. java

@Entity
@Table(name = "userSubjects")
public class UserSubjects {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Integer id;

    @OneToOne
    @JoinColumn(name="subjectId", referencedColumnName = "id")
    private Subjects subjects;

    @Column(name = "userId")
    private Integer userId;

    public UserSubjects(Integer id, Subjects subjects, Integer userId) {
        this.id = id;
        this.subjects = subjects;
        this.userId = userId;
    }

    public UserSubjects() {
    }

    // getters and setters..

Но после того, как я хочу получить данные, которые у меня есть в этой таблице, я столкнулся с проблемой. Я хочу получить не только subjectId , но и все данные, которые соответствуют subjectId в субъектах таблица.

UserSubjectsRepository. java

public interface UserSubjectsRepository extends JpaRepository<UserSubjects, Integer> {
    List<UserSubjects> findAllSubjectsByUserId(Integer userId);
}

UserSubjectsService. java

@Service
public class UserSubjectsService {
    @Autowired
    UserSubjectsRepository userSubjectsRepository;

    // Save subjects in UserSubjects repository
    public UserSubjects saveUserSubjects(Integer subjectId, Integer userId, UserSubjects userSubjects) {
        userSubjects.setSubjectId(subjectId);
        userSubjects.setUserId(userId);
        return userSubjectsRepository.save(userSubjects);
    }

    // Get all subjects that have current user
    public List<UserSubjects> getAllSubjects(Integer userId) {
        return userSubjectsRepository.findAllSubjectsByUserId(userId);
    }
}

CourseRegistrationController . java

@RestController
public class CourseRegistrationController {
    @Autowired
    UserSubjectsService userSubjectsService;

    // Post request for adding subjects to userSubject table
    @RequestMapping(value = "courses/registration", method = RequestMethod.POST)
    public UserSubjects addUserSubjects(@AuthenticationPrincipal MyUserDetails myUserDetails,
                                        @RequestBody UserSubjects userSubjects) {
        return userSubjectsService.saveUserSubjects(userSubjects.getSubjectId(), myUserDetails.getId(), userSubjects);
    }

    // Get all subjects of user
    @RequestMapping(value = "courses/show", method = RequestMethod.GET)
    public List<UserSubjects> getAllSubjectsOfUser(@AuthenticationPrincipal MyUserDetails myUserDetails) {
        return userSubjectsService.getAllSubjects(myUserDetails.getId());
    }
}

SubjectsEntity. java

@Entity
@Table(name = "subjects")
public class Subjects {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Integer id;

    @Column(name = "title", length = 255)
    private String title;

    @Column(name = "codeSub", length = 255)
    private String codeSub;

    @ManyToOne
    @JoinColumn(name="facultyId", referencedColumnName = "id")
    private Faculty faculty;

    @ManyToOne
    @JoinColumn(name="departmentId", referencedColumnName = "id")
    private Departments departments;

    @Column(name = "ects")
    private String ects;

    @Column(name = "lc")
    private String lc;

    public Subjects(Integer id, String title, String codeSub, Faculty faculty, Departments departments, String ects, String lc) {
        this.id = id;
        this.title = title;
        this.codeSub = codeSub;
        this.faculty = faculty;
        this.departments = departments;
        this.ects = ects;
        this.lc = lc;
    }

    public Subjects() {
    }

    // gettters and setters..

POST-запрос от почтальона

{
    "subjectId":"2"
}

Есть ли другой способ сохранить в Jpa данные из POST-запроса?

1 Ответ

1 голос
/ 28 апреля 2020

Вместо установки Integer subjectId непосредственно из тела POST вы должны найти Subject с помощью subjectId и установить его на UserSubjects.

Для достижения этого вам необходимо:

  1. Создайте отдельное POJO для вас тело POST-запроса:
public final class AddUserSubjectsRequest {
    private Integer subjectId;

    public Integer getSubjectId() {
        return subjectId;
    }

    public void setSubjectId(Integer subjectId) {
        this.subjectId = subjectId;
    }
}
Используйте только что созданный AddUserSubjectsRequest в вашем контроллере (подробнее об этом здесь ):
@RequestMapping(value = "courses/registration", method = RequestMethod.POST)
public UserSubjects addUserSubjects(
    @AuthenticationPrincipal MyUserDetails myUserDetails,
    @RequestBody AddUserSubjectsRequest request
) {
    return userSubjectsService.saveUserSubjects(request.getSubjectId(), myUserDetails.getId());
}
Создать SubjectsRepository, если у вас его еще нет:
public interface SubjectsRepository extends JpaRepository<Subjects, Integer> { }
Введите его UserSubjectsService:
@Service
public class UserSubjectsService {
    @Autowired
    UserSubjectsRepository userSubjectsRepository;

    @Autowired
    SubjectsRepository subjectsRepository;

    // methods left intact
}
Изменить UserSubjectsService.saveUserSubjects метод:
public UserSubjects saveUserSubjects(Integer subjectId, Integer userId) {
    final UserSubjects userSubjects = new UserSubjects();
    userSubjects.setSubject(subjectsRepository.getOne(subjectId));
    userSubjects.setUserId(userId);
    return userSubjectsRepository.save(userSubjects);
}

Примечание: отныне вы должны обработать случай, когда Subject не может быть найден. Это может произойти, если в таблице subjects отсутствует subjectId из POST-запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...