@@ Cacheable无法更新

问题描述 投票:0回答:1

在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 hazelcast
1个回答
0
投票

您不能批量更新使用Spring的缓存。

请检查以下issue-状态为拒绝:]

感谢创建问题,但我不希望将这种额外的复杂性添加到缓存抽象中。这并不是要为您管理状态(如果允许的话,下一个逻辑步骤是我们必须使返回的列表与每个项目保持同步)。如果不这样做,我们就会前后矛盾,我们仅提供一种使用注释与缓存进行对话的方法。这不是很有帮助。

回到您的示例,这通常是二级缓存为您准备的。这不在缓存抽象的范围内。

© www.soinside.com 2019 - 2024. All rights reserved.