如何在Spring Boot MVC中更新数据

时间:2019-05-08 12:32:23

标签: java rest spring-boot spring-mvc spring-boot-test

我在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 :(得分:0)

您在@Transactional中缺少了CommentService注释。在按方法级别添加它会更好,但请尝试将其添加到类级别以验证是否可以解决此问题:

@Service
@Transactional
public class CommentService {