Spring Boot 带有泛型的Sping Boot 和服务接口的多个实现

l7wslrjt  于 2022-11-05  发布在  Spring
关注(0)|答案(1)|浏览(232)

这实际上是工作,但声纳抱怨没有使用泛型。。我尽了最大努力来处理这个问题,但。。
问题本身:
首先,我有一个服务接口:

public interface QueueMessageReceiver<T extends QueueMessage> {

    boolean onMessage(T queueMessage);

    Class<T> getQueueMessageType();

}

用泛型编译nice和smooth
其次,我有几个实现该接口的服务,我添加了一个示例,还有更多(3个以上)

@Component
public class DBoxCreateMessageReceiver implements QueueMessageReceiver<DBoxCreateMessageDTO> {

    @Autowired
    private DatabaseService databaseService;

    @Override
    public boolean onMessage(DBoxCreateMessageDTO queueMessage) {
        String uuid = databaseService.createMessage(queueMessage);
        if (uuid == null) {
            return false;
        }
        return true;

    }

    @Override
    public Class<DBoxCreateMessageDTO> getQueueMessageType() {
        return DBoxCreateMessageDTO.class;
    }

}

当然,DBoxCreateMessageDTO扩展了队列消息
接下来,我有一个组件,它保存所有的服务实现,并根据传入的消息类型决定哪个实现必须处理当前消息
queueMessageReceivers通过Spring自动连接获取所有实现组件
但是我有一个编译错误:queueMessageReceiver.onMessage(queueMessage),内容为:类型队列消息接收器〈capture#3-of?〉中的方法onMessage(capture#3-of?)不适用于参数(队列消息)

@Autowired
    private QueueMessageReceiver<?>[] queueMessageReceivers;

    @SuppressWarnings("unchecked")
    @Override
    public boolean onMessage(QueueMessage queueMessage) {
        for (QueueMessageReceiver<?> queueMessageReceiver : queueMessageReceivers) {
            if (queueMessageReceiver.getQueueMessageType().equals(queueMessage.getClass())) {
                return queueMessageReceiver.onMessage(queueMessage);
            }
        }
        return false;
    }

在这个泛型实现中调用显式实现的正确方法是什么?
如果我从类中删除所有的泛型,它工作得很好,但是声纳抱怨代码有味道...所以如果有人知道如何处理泛型,会很有帮助。
多谢了

yfwxisqw

yfwxisqw1#

使用<T extends QueueMessage>只能保证你读取的是QueueMessage而不是任何子类型。
因此

boolean onMessage(T queueMessage);

应该是

boolean onMessage(QueueMessage queueMessage);

@Autowired
private QueueMessageReceiver<?>[] queueMessageReceivers;

应该是

@Autowired
private QueueMessageReceiver<? extends QueueMessage>[] queueMessageReceivers;

在接收器中,将对象转换为所需的对象

@Override
    public boolean onMessage(DBoxCreateMessageDTO queueMessage) {
        String uuid = databaseService.createMessage(queueMessage);

@Override
    public boolean onMessage(QueueMessage queueMessage) {
        DBoxCreateMessageDTO d = (DBoxCreateMessageDTO) queueMessage;
        String uuid = databaseService.createMessage(d);

相关问题