在spring框架中,我们有@Cacheable来缓存数据。现在我的要求是我想使用Get方法检索所有数据表单数据库。
控制器
@RequestMapping(value = "/getUploadData", method = RequestMethod.GET)
public ResponseEntity<List<Ticket>> getUploadFileData() throws IOException {
return new ResponseEntity<>(ticketBookingService.getFileUploadData(), HttpStatus.OK);
}
服务
@Cacheable(value="ticketsCache")
public List<Ticket> getFileUploadData() {
List<Ticket> listOfData = (List<Ticket>) ticketBookingDao.findAll();
return listOfData;
}
}
输出: click image here to check output
http://localhost:8080/api/tickets/getUploadData
[{"ticketId":1,"passengerName":"Sean","bookingDate":1502649000000,"sourceStation":"Pune","destStation":"Mumbai","email":"[email protected]"},{"ticketId":2,"passengerName":"Raj","bookingDate":1502476200000,"sourceStation":"Chennai","destStation":"Mumbai","email":"[email protected]"},{"ticketId":3,"passengerName":"Martin","bookingDate":1502735400000,"sourceStation":"Delhi","destStation":"Mumbai","email":"[email protected]"},{"ticketId":4,"passengerName":"John","bookingDate":1503253800000,"sourceStation":"Chennai","destStation":"Mumbai","email":"[email protected]"}]
现在我将通过票证进行获取和放置操作。
获取:控制器:
@GetMapping(value="/ticket/{ticketId}")
public Ticket getTicketById(@PathVariable("ticketId")Integer ticketId){
return ticketBookingService.getTicketById(ticketId);
}
服务:
@Cacheable(value="ticketsCache",key="#ticketId",unless="#result==null")
public Ticket getTicketById(Integer ticketId) {
return ticketBookingDao.findOne(ticketId);
}
http://localhost:8080/api/tickets/ticket/1
{“ ticketId”:1,“ passengerName”:“ Sean”,“ bookingDate”:1502649000000,“ sourceStation”:“ Pune”,“ destStation”:“ Mumbai”,“ email”:“ sean.s2017@yahoo。 com“}
现在当我使用工单ID更新电子邮件时:
放置:控制器
@PutMapping(value="/ticket/{ticketId}/{newEmail:.+}")
public Ticket updateTicket(@PathVariable("ticketId")Integer ticketId,@PathVariable("newEmail")String newEmail){
return ticketBookingService.updateTicket(ticketId,newEmail);
}
服务:
@CachePut(value="ticketsCache",key="#ticketId")
public Ticket updateTicket(Integer ticketId, String newEmail) {
Ticket upadedTicket = null;
Ticket ticketFromDb = ticketBookingDao.findOne(ticketId);
if(ticketFromDb != null){
ticketFromDb.setEmail(newEmail);
upadedTicket = ticketBookingDao.save(ticketFromDb);
}
return upadedTicket;
}
http://localhost:8080/api/tickets/ticket/1/[email protected]
{
"ticketId": 1,
"passengerName": "Sean",
"bookingDate": 1502649000000,
"sourceStation": "Pune",
"destStation": "Mumbai",
"email": "[email protected]"
}
现在当使用ID更改获取数据时正在更新。
http://localhost:8080/api/tickets/ticket/1
{"ticketId":1,"passengerName":"Sean","bookingDate":1502649000000,"sourceStation":"Pune","destStation":"Mumbai","email":"[email protected]"}
现在,我的问题是,如果我尝试通过使用上述第一个URL来获取所有数据,我的更改未反映出来。
http://localhost:8080/api/tickets/getUploadData
[{"ticketId":1,"passengerName":"Sean","bookingDate":1502649000000,"sourceStation":"Pune","destStation":"Mumbai","email":"[email protected]"},{"ticketId":2,"passengerName":"Raj","bookingDate":1502476200000,"sourceStation":"Chennai","destStation":"Mumbai","email":"[email protected]"},{"ticketId":3,"passengerName":"Martin","bookingDate":1502735400000,"sourceStation":"Delhi","destStation":"Mumbai","email":"[email protected]"},{"ticketId":4,"passengerName":"John","bookingDate":1503253800000,"sourceStation":"Chennai","destStation":"Mumbai","email":"[email protected]"}]
建议我如何重新解决此问题
您不能批量更新使用Spring的缓存。
请检查以下issue-状态为拒绝:]
感谢创建问题,但我不希望将这种额外的复杂性添加到缓存抽象中。这并不是要为您管理状态(如果允许的话,下一个逻辑步骤是我们必须使返回的列表与每个项目保持同步)。如果不这样做,我们就会前后矛盾,我们仅提供一种使用注释与缓存进行对话的方法。这不是很有帮助。
回到您的示例,这通常是二级缓存为您准备的。这不在缓存抽象的范围内。