当我使用默认键(例如-
)时,Spring没有缓存我的函数@PostMapping("getDashboardDataNew")
@Cacheable(value="myDash")
public DashboardDto getHomeDashboardDataNew(@RequestBody DashboardRequest dashboardRequest) {
LOGGER.info(" Get All the Dashboard Information : ");
//code
return dashboardDto;
}
但是当我使用sPEL提供自定义密钥时,它会缓存响应,例如。
@PostMapping("getDashboardDataNew")
@Cacheable(value="myDash", key="#dashboardRequest.level")
public DashboardDto getHomeDashboardDataNew(@RequestBody DashboardRequest dashboardRequest) {
LOGGER.info(" Get All the Dashboard Information : ");
//code
return dashboardDto;
}
请求有效载荷始终为-
{“ fromDate”:null,“ toDate”:null,“ theme”:null,“ activity”:null,“ level”:1,“ levelValue”:null,“ state”:null,“ district”:空}
即使使用eclipse自动生成equals和hashcode之后,spring也不缓存该值。以下是自动生成的代码
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((activity == null) ? 0 : activity.hashCode());
result = prime * result + ((fromDate == null) ? 0 : fromDate.hashCode());
result = prime * result + ((level == null) ? 0 : level.hashCode());
result = prime * result + ((levelValue == null) ? 0 : levelValue.hashCode());
result = prime * result + ((organizer == null) ? 0 : organizer.hashCode());
result = prime * result + ((theme == null) ? 0 : theme.hashCode());
result = prime * result + ((toDate == null) ? 0 : toDate.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
DashboardRequest other = (DashboardRequest) obj;
if (activity == null) {
if (other.activity != null)
return false;
} else if (!activity.equals(other.activity))
return false;
if (fromDate == null) {
if (other.fromDate != null)
return false;
} else if (!fromDate.equals(other.fromDate))
return false;
if (level == null) {
if (other.level != null)
return false;
} else if (!level.equals(other.level))
return false;
if (levelValue == null) {
if (other.levelValue != null)
return false;
} else if (!levelValue.equals(other.levelValue))
return false;
if (organizer == null) {
if (other.organizer != null)
return false;
} else if (!organizer.equals(other.organizer))
return false;
if (theme == null) {
if (other.theme != null)
return false;
} else if (!theme.equals(other.theme))
return false;
if (toDate == null) {
if (other.toDate != null)
return false;
} else if (!toDate.equals(other.toDate))
return false;
return true;
}
我没有更改请求有效载荷。
答案 0 :(得分:1)
默认情况下,当不提供任何键时,Spring缓存依赖于SimpleKeyGenerator,后者依赖于参数的哈希码来生成键。您可以检查此link。
答案 1 :(得分:0)
我弄清楚这里出了什么问题。 我正在函数内部某处更改请求有效负载的属性之一。
dashboardRequest.setLevel(dashboardRequest.getLevel()+ 1);
并且当方法执行使用修改后的对象而不是参数中提供的值后,Spring缓存AOP将值放入缓存中,从而有效地使我的密钥不同于请求有效负载生成的密钥。希望这对某人有帮助。