gpt4 book ai didi

java - spring 通用应用程序事件无法到达目的地

转载 作者:行者123 更新时间:2023-12-03 23:46:48 26 4
gpt4 key购买 nike

我有以下 Spring 架 bean 。这个想法是它保留某物的一个实例,并在某物发生变化时触发一个更改事件(同时提供旧值和新值):

public class Holder<T> implements ApplicationEventPublisherAware {
private final Class<T> payloadType; //because java generics are incomplete
private T curr; //latest value being held
private ApplicationEventPublisher publisher; //spring context ref

public Holder(Class<T> payloadType) {
this.payloadType = payloadType;
}

public void change() throws Exception {
T prev = curr;
curr = payloadType.newInstance();
publisher.publishEvent(new ContentsChangedEvent<>(prev, curr));
}
}

然后我有一个监听器类对这些事件使用react:
@Named
public class Listener {

@EventListener
public void onChange(ContentsChangedEvent<Cat> event) {
//never gets called
}

@EventListener
public void onErasedChange(ContentsChangedEvent<?> event) {
//does get called
}
}

我的问题是通用(正确)事件监听器方法永远不会被调用(获得 Event<Cat> 的那个),只有被删除的那个。

为了完整起见,这里是 spring context.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd">

<context:annotation-config/>
<context:component-scan base-package="net.radai"/>

<bean id="holder" class="net.radai.Holder">
<constructor-arg type="java.lang.Class" value="net.radai.Cat"/>
</bean>
</beans>

我也把整件事都放在了 github - https://github.com/radai-rosenblatt/spring-events 上。它是一个 Maven 项目——你构建它,你会得到一个失败的测试。

我究竟做错了什么?

注意: 在实际用例中,我希望有多个这样的持有者,并迫使所有监听器以 Not Acceptable 方式丢弃与他们无关的事件

最佳答案

public class ContentsChangedEvent<T> extends ApplicationEvent{

public ContentsChangedEvent(Holder<T> source, T prev, T curr) {
super(source);
this.prev = prev;
this.curr = curr;
}

}

//Holder class
public void change() {
T prev = curr;
try {
curr = payloadType.newInstance();
} catch (Exception e) {
int g = 8;
}
publisher.publishEvent(new ContentsChangedEvent<T>(this, prev, curr));
}

onChange 和 onErasedChange 都会被调用。

关于java - spring 通用应用程序事件无法到达目的地,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35883022/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com