我一個嘗試使用「自己造」對象在@Cacheable註釋關鍵的部分:春緩存抽象和自定義轉換器
@Cacheable(value = "tecdocData", key = "'TCDD:stos::'.concat(#stos)")
List<TecDocData> getTecDocData(Collection<SimpleTecDocObject> stos);
這就導致了一個錯誤與以下堆棧跟蹤(相關部分):
Caused by: org.springframework.expression.AccessException: Problem invoking method: public java.lang.String java.lang.String.concat(java.lang.String)
at org.springframework.expression.spel.support.ReflectiveMethodExecutor.execute(ReflectiveMethodExecutor.java:73)
at org.springframework.expression.spel.ast.MethodReference$MethodValueRef.getValue(MethodReference.java:97)
... 100 more
Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1001E:(pos 0): Type conversion problem, cannot convert from java.util.HashSet<?> to java.lang.String
at org.springframework.expression.spel.support.StandardTypeConverter.convertValue(StandardTypeConverter.java:72)
at org.springframework.expression.spel.support.ReflectionHelper.convertArguments(ReflectionHelper.java:281)
at org.springframework.expression.spel.support.ReflectiveMethodExecutor.execute(ReflectiveMethodExecutor.java:61)
... 101 more
Caused by: org.springframework.core.convert.ConversionFailedException: Failed to convert from type java.util.HashSet<?> to type java.lang.String for value '[SimpleTecDocObject [guid=GUID-C2DBD976-79F0-42FB-94CE-9352DE43A184, locale=de, version=1]]'; nested exception is org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type com.sxp.setix.api.SimpleTecDocObject to type java.lang.String
at org.springframework.core.convert.support.ConversionUtils.invokeConverter(ConversionUtils.java:41)
at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:169)
at org.springframework.expression.spel.support.StandardTypeConverter.convertValue(StandardTypeConverter.java:66)
... 103 more
Caused by: org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type com.sxp.setix.api.SimpleTecDocObject to type java.lang.String
at org.springframework.core.convert.support.GenericConversionService.handleConverterNotFound(GenericConversionService.java:276)
at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:172)
at org.springframework.core.convert.support.CollectionToStringConverter.convert(CollectionToStringConverter.java:65)
at org.springframework.core.convert.support.ConversionUtils.invokeConverter(ConversionUtils.java:35)
... 105 more
據我所看到的,春天也使試圖轉換HashSet的,但不能轉換載「SimpleTecDocObject」的價值觀。
爲了解決這個問題,我定義了一個轉換器並將其註冊到我的Spring配置中。這樣做是相當筆直向前,如 「7.5春3類型轉換」 7. Validation, Data Binding, and Type Conversion
Converter類記載:
public class SimpleTecdocObjectConverter implements Converter<SimpleTecDocObject, String> {
@Override
public String convert(final SimpleTecDocObject source) {
StringBuilder result = new StringBuilder();
result.append(source.getGuid()).append(source.getLocale()).append(source.getVersion());
return result.toString();
}
}
Spring配置:
<bean id="conversionService"
class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<bean id="tdConverter" class="com.kion.lsg.service.tecdoc.converter.SimpleTecdocObjectConverter" />
</list>
</property>
</bean>
不幸的是這似乎不工作。我得到與上述完全相同的例外。 Spring抽象似乎忽略了上面定義的conversionService並採用一些默認的。
解決方案: Lotsa由於阿克沙伊辛格
代替使用轉換器可以使用使用SpEL表達的內部靜態密鑰發生器的:
@Cacheable(value = "tecdocData", key = "T(com.kion.lsg.service.tecdoc.converter.SimpleTecDocObjectCollectionKeyGenerator).generateKey(#stos)")
List<TecDocData> getTecDocData(Collection<SimpleTecDocObject> stos);
例如具有的KeyGenerator定義如下:
public class SimpleTecDocObjectCollectionKeyGenerator {
public static String generateKey(final Collection<SimpleTecDocObject> stos){
List<String> tecdocIdsList = new ArrayList<>();
for (SimpleTecDocObject sto : stos){
tecdocIdsList.add(sto.toString());
}
Collections.sort(tecdocIdsList);
return tecdocIdsList.toString();
}
}
謝謝,「#stos.toString()」工作正常。 – user2652217
歡迎您。很高興它對你有效。請接受答案。 – Akshay