记一个深度隐藏的缓存问题DmNode是根据节点ID进行缓存的,它有一个深度嵌套的对话逻辑结构,包括Reply。传递给answergeneration的时候,没有DmNode的痕迹,因为它是放在FlowResult中的。@OverridepublicAnswerPodgenerate(FlowResultflowResult,DmContextdmContext,Envenv){ListreplyItems=Lists.newArrayList();for(Replyreply:flowResult.getReplies()){ReplyItemitem;try{item=generate(reply,dmContext,env);}catch(Exceptione){//对话过程中,如果generate异常,answer会被吞掉不显示log.warn("Theanswergenerationfailederror:{}",e);继续;}replyItems.add(item);}ListcapsuleDtos=capsuleService.convert(flowResult.getCapsules());返回answerPodBuilder.create(flowResult,replyItems,capsuleDtos);}然后,TextReply的processText()方法,脑子一热,修改了成员文本。结果,因为Reply被缓存,所以生成的结果被缓存。publicclassTextReply实现Reply{privateStringtext;publicTextReply(Stringtext){this.text=text;}publicStringgetText(){返回文本;}publicvoidprocessText(DmContextdmContext,MarkServicemarkService){this.text=TextProcessor.process(text,dmContext,markService);}}总结:修改成员时注意返回结果,尽量避免引用对象,尽量使用深拷贝进行拷贝