我在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的日志记录,则也没有对数据库的更新请求。 我在做什么错了?
答案 0 :(得分:0)
您在@Transactional
中缺少了CommentService
注释。在按方法级别添加它会更好,但请尝试将其添加到类级别以验证是否可以解决此问题:
@Service
@Transactional
public class CommentService {