Как обновить данные в Spring Boot MVC - PullRequest
0 голосов
/ 08 мая 2019

У меня самый распространенный проект на Spring Boot MVC.и я пытаюсь записать данные обновления через PUT.

@RestController
@RequestMapping(CommentController.PATH)
public class CommentController {

    public final static String PATH = "/comments";

    @Autowired
    private CommentService service;

    @PutMapping("/{id}")
    public Comment update(@RequestBody Comment comment, @PathVariable Long id) {
        return service.update(id, comment);
    }
}

@Service
public class CommentService {

    @Autowired
    private CommentRepository repository;

    public Comment update(Long id, Comment entity) {
        Optional<Comment> optionalEntityFromDB = repository.findById(id);
        return optionalEntityFromDB
                .map(e -> saveAndReturnSavedEntity(entity, e))
                .orElseThrow(getNotFoundExceptionSupplier("Cannot update - not exist entity by id: " + id, OBJECT_NOT_FOUND));
    }

    private Comment saveAndReturnSavedEntity(Comment entity, Comment entityFromDB) {
        entity.setId(entityFromDB.getId());
        return repository.save(entity);
    }

}

@Repository
public interface CommentRepository extends JpaRepository<Comment, Long> {
}

@Entity
public class Comment  {
    @Id
    @Column
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    protected Long id;

    @Column(name = "name")
    protected String name;
}

, затем я пишу тест с возможностью проверки обновленных данных:

@SpringBootTest
@RunWith(SpringRunner.class)
@Transactional
// DBUnit config:
@DatabaseSetup("/comment.xml")
@TestExecutionListeners({
        TransactionalTestExecutionListener.class,
        DependencyInjectionTestExecutionListener.class,
        DbUnitTestExecutionListener.class
})
public class CommentControllerTest {

    private MockMvc mockMvc;
    private static String route = PATH + "/{id}";

    @Autowired
    private CommentController commentController;

    @Autowired
    private CommentRepository commentRepository;

    @PersistenceContext
    private EntityManager entityManager;

    @Before
    public void setup() {
        mockMvc = MockMvcBuilders.standaloneSetup(commentController)
                .build();
    }

    @Test
    public void update_ShouldReturnCreated2() throws Exception {
        int id = 1;
        String name = "JohnNew";
        Comment expectedComment = new Comment();
        expectedComment.setName(name);

        ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter();
        String json = ow.writeValueAsString(expectedComment);

        this.mockMvc.perform(put(route, id)
                .contentType(MediaType.APPLICATION_JSON_UTF8)
                .content(json))
                .andDo(print());

        entityManager.clear();
        entityManager.flush();

        Comment commentUpdated = commentRepository.findById(1L).get();
        assertThat(commentUpdated.getName(), equalTo(name));        // not equals!
    }
}    

comment.xml:

<dataset>
    <Comment id="1" name="John" />
</dataset>

но проблема в том, что данные не обновляются.Если вы включите ведение журнала Hibernat, то также не будет запроса на обновление базы данных.Что я делаю не так?

1 Ответ

0 голосов
/ 08 мая 2019

Вы пропускаете аннотацию @Transactional из CommentService.Хотя может быть лучше добавить его на уровне метода, попробуйте добавить его на уровень класса, чтобы проверить, что это исправляет:

@Service
@Transactional
public class CommentService {
...