使用Pousse-Café框架新增Command后出现实现冲突运行时错误
解决Pousse-Café中Command的消息实现冲突问题
你遇到的核心问题是错误地在Command接口上标注了@MessageImplementation注解,导致Pousse-Café运行时认为同一个消息接口存在多个冲突的实现。
问题根源分析
Pousse-Café的@MessageImplementation注解是用来标记消息接口的具体实现类的,而不是消息接口本身。你在UpdateAvailablity接口上添加了这个注解,同时又在UpdateAvailablityData实现类上也加了同样的注解,这就导致框架检测到两个指向同一个消息接口的“实现”,直接触发了冲突异常。
修正方案
只需要移除Command接口上的@MessageImplementation注解,保留实现类上的即可:
修正后的Command接口代码
public interface UpdateAvailablity extends Command { Attribute<UserId> id(); Attribute<Boolean> availablity(); }
保持不变的实现类代码
@SuppressWarnings("serial") @MessageImplementation(message = UpdateAvailablity.class) public class UpdateAvailablityData implements Serializable, UpdateAvailablity { @Override public Attribute<UserId> id() { return AttributeBuilder .stringId(UserId.class) .read(() -> id) .write(value -> id = value) .build(); } private String id; @Override public Attribute<Boolean> availablity() { return AttributeBuilder .single(Boolean.class) .read(() -> availablity) .write(value -> availablity = value) .build(); } private boolean availablity; }
额外注意事项
- 消息接口(比如你的
UpdateAvailablity)只需要定义命令的属性契约,不需要任何实现相关的注解。 - 只有具体的实现类(比如
UpdateAvailablityData)才需要用@MessageImplementation来关联对应的消息接口,让框架识别这是该消息的有效实现。
内容的提问来源于stack exchange,提问作者GDethier
相关产品推荐
相关产品推荐

