Chvalov
@Chvalov

Как правильно реализовать обновление и сохранение контента в Spring-Boot?

Entity
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;

import javax.persistence.*;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.util.Date;

@Entity
@Table(name = "projects")
public class Projects {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "project_id")
    private Long id;

    @Size(min=4, max=128)
    @NotBlank()
    @Column(name = "name", nullable = false)
    private String name;

    @Column(name = "description" , nullable = true)   // TODO Text
    private String description;

    @Temporal(TemporalType.TIMESTAMP)
    @CreationTimestamp
    @Column(name = "created", nullable=false, updatable=false)
    private Date createDate;

    @Temporal(TemporalType.TIMESTAMP)
    @UpdateTimestamp
//    @LastModifiedDate
    @Column(name = "updated", nullable=false, updatable=true)
    private Date updateDate;

    public Projects() {
    }

    public Projects(@Size(min = 5, max = 128) @NotBlank() String name, String description, Date createDate, Date updateDate) {
        this.name = name;
        this.description = description;
        this.createDate = createDate;
        this.updateDate = updateDate;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Date getCreateDate() {
        return createDate;
    }

    public void setCreateDate(Date createDate) {
        this.createDate = createDate;
    }

    public Date getUpdateDate() {
        return updateDate;
    }

    public void setUpdateDate(Date updateDate) {
        this.updateDate = updateDate;
    }

}
Repositories
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import spoofing.Entity.Projects;

import java.util.List;

@Repository
public interface ProjectsRepository extends JpaRepository<Projects, Long> {

    // Поиск по названию проекта
    List<Projects> findByName(String name);

}
ProjectsService
import spoofing.Entity.Projects;
import java.util.List;

public interface ProjectsService {

    Projects addProjects(Projects projects);
    void delete(long id);
    List<Projects> getByName(String name);
    Projects getById(long id);
    Projects editProjects(Projects Projects);
    List<Projects> getAll();

}
ProjectsServiceImpl
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import spoofing.Entity.Projects;
import spoofing.Repositories.ProjectsRepository;
import spoofing.Service.ProjectsService;

import java.util.List;

@Service
public class ProjectsServiceImpl implements ProjectsService {

    @Autowired
    private ProjectsRepository projectsRepository;

    @Override
    public List<Projects> getAll() {
        return projectsRepository.findAll();
    }

    @Override
    public List<Projects> getByName(String name) {
        return projectsRepository.findByName(name);
    }

    @Override
    public Projects addProjects(Projects projects) {
        Projects savedProjects = projectsRepository.saveAndFlush(projects);
        return savedProjects;
    }

    @Override
    public Projects editProjects(Projects projects) {
        return projectsRepository.saveAndFlush(projects);
    }

    @Override
    public void delete(long id) {
        projectsRepository.deleteById(id);
    }

    @Override
    public Projects getById(long id) {
        return projectsRepository.getOne(id);
    }

}
ProjectsController - RestController
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import spoofing.Entity.Projects;
import spoofing.Service.ProjectsService;

import java.util.List;

@RestController
@RequestMapping("/api/projects")
public class ProjectsController {

    @Autowired // TODO - нужен ли здесь автоваринг ???
    private ProjectsService projectsService;

    @GetMapping("/all")
    public List<Projects> findAll() {
        return projectsService.getAll();
    }

    @GetMapping("/find/{name}")
    public List<Projects> findByName(@PathVariable final String name) {
        return projectsService.getByName(name);
    }

    @PostMapping("/save")
    public Projects save(@RequestBody final Projects projects) {
        projectsService.addProjects(projects);
        return projectsService.getById(projects.getId());
    }

    @PutMapping("/edit/{id}")
    public Projects edit(@RequestBody final Projects projects) {    // @PathVariable long id,
        // Example - https://www.djamware.com/post/59be51e780aca768e4d2b140/tutorial-of-building-java-rest-api-using-spring-boot-and-mongodb
        projectsService.editProjects(projects);
        return projectsService.getById(projects.getId());
    }

    // TODO Сделать валидацию и ответы
    // Пример - http://websystique.com/spring-boot/spring-boot-rest-api-example/
    @DeleteMapping("delete/{id}")
    public void delete(@PathVariable("id") long id) {   //ResponseEntity<Void>
        projectsService.delete(id);
        //return ResponseEntity.status(HttpStatus.OK).build();
    }

}
Ситуация следующая, если POST запросом отправить name и description на api/projects/save создается новая запись в БД, но если добавить еще и id к запросу то запись в БД обновляется, как быть в данной ситуации ?? (Проверять чтобы ID == NULL ?)

Также не знаю как просто сделать обновление записи в БД по id api/projects/edit/{id} чтобы в теле запроса не передавать ID
  • Вопрос задан
  • 298 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы