当前位置: 首页 > 知识库问答 >
问题:

Spring 4.2 应用程序事件与Spring MVC 一起触发两次,为什么?

强志学
2023-03-14

我正在处理Spring 4.2.0.BUILD-SNAPSHOT事件,由于一些我还没有弄清楚的原因,监听器在发布任何事件(无论是从ApplicationEvent扩展还是任何任意事件)后触发了两次,但是在运行测试用例时一切都按预期工作,现在想知道Spring MVC上下文中的注释驱动事件发生了什么

事件发布界面

public interface ListingRegistrationService {
    public void registerListing(ListingResource listing);

}

@Component
class ListingRegistrationServiceImpl implements ListingRegistrationService{

    private final ApplicationEventPublisher publisher;

    @Autowired
    public ListingRegistrationServiceImpl(ApplicationEventPublisher publisher) {
        this.publisher = publisher;
    }

    @Override
    public void registerListing(ListingResource listing) {
       //process
        publisher.publishEvent(new ListingCreatedEvent(listing));
        System.out.println("Event above...");
    }

}

事件监听器

@EventListener
    @Async
    public void sendMailForSuggestedListing(Supplier<ListingResource> listingCreatedEvent)  {
        System.out.println("Event fired...");
    }

终点/入口点

public ResponseEntity<ResponseStatus> registerListing(@RequestBody @Valid ListingResource listing,BindingResult result) throws URISyntaxException {
       ResponseEntity<ResponseStatus> response = null;
       listingService.registerListing(listing); //  publish the event
       response = ResponseEntity.created(new URI(""));
         return response;
            }

结果:事件触发…事件触发…以上事件。。

我确实怀疑EventListener bean注册了两次。您可以启用org.springframework.context.event。EventListenerMethodProcessor设置为跟踪级别,以检查此特定类发生了什么。

- 斯特凡·尼科尔

TRACE组织.Spring框架工作.上下文.事件事件侦听器方法处理器它正在发生两次

12:02:32,878 DEBUG ntext.event.EventListenerMethodProcessor: 138 - 1 @EventListener methods processed on bean 'mailServiceImpl': [public void com.service.MailServiceImpl.sendMailForSuggestedListing(com.service.events.CreationEvent)]
12:02:32,878 DEBUG ntext.event.EventListenerMethodProcessor: 138 - 1 @EventListener methods processed on bean 'mailServiceImpl': [public void com.service.MailServiceImpl.sendMailForSuggestedListing(com.service.events.CreationEvent)]
12:02:32,878 TRACE ntext.event.EventListenerMethodProcessor: 132 - No @EventListener annotations found on bean class: class com.service.MetaServiceImpl
12:02:32,878 TRACE ntext.event.EventListenerMethodProcessor: 132 - No @EventListener annotations found on bean class: class com.service.MetaServiceImpl

Java配置

@Configuration
@ComponentScan(basePackages = {"com.**.domain",
        "com.**.repositories", "com.**.service",
        "com.**.security" })
@PropertySource(value = { "classpath:application.properties" })
public class ServiceConfig 


Configuration
@EnableWebMvc
@EnableSwagger
@EnableSpringDataWebSupport
@EnableMongoRepositories("com.**.repositories")
@ComponentScan(basePackages = {"com.**.config","com.**.rest.controllers","com.**.rest.tokens"})
public class WebConfig extends WebMvcConfigurerAdapter {

@Configuration
@EnableMongoRepositories("com.**.**.repositories")
public class MongoRepositoryConfig extends AbstractMongoConfiguration

共有2个答案

谢昂雄
2023-03-14

遇到过类似的情况——事件发布两次。

在我的案例中,根本原因是web中的web应用程序上下文配置错误。xmlDispatcherServlet与传递给servlet监听器的上下文xml文件相同。将DispatcherServlet声明中的重复引用替换为空引用,如下所示:

如果不需要应用程序上下文层次结构,应用程序可以只配置“根”上下文,并将contextConfigLocation Servlet参数留空。

这为我解决了这个问题。

西门高歌
2023-03-14

我有同样的问题。给我的。。。我注册了两次事件侦听器,因为我在一个配置类中覆盖了扫描的整个包路径

@ComponentScan(  basePackages = {"my.root.package"} )
@Configuration
public class MyAppConfig {
      //... 
}

然后我在另一个配置类中手工添加了相同的eventListener bean,如下所示

@Configuration
public class SpringConfig {
    ...
    // SomeEventListener was located @ my.root.package.event and had @Component annotation
    @Bean 
    public SomeEventListener someEventListener() {
        return new SomeEventListener();
    }
    ...
}

导致其注册两次。

 类似资料:
  • 问题内容: 我有以下代码,但我的问题是该事件被触发了两次。我不知道是什么原因造成的。我怀疑是由供应商前缀引起的,但并非如此。即使我只离开,它仍然会开火两次。 CSS JS 问题答案: 对于您和,每个已转换的属性都会触发。 您可以在访问与事件关联的属性。 没有“ transition s end”事件,因此您可能需要一些技巧,例如仅过滤其中一个过渡属性的回调处理。例如: ps。没有浏览器会触发该事件

  • 我部署了一个用Python2编写的服务。7使用AWS Lambda,它是关于从一些页面提取数据并将结果发送到web应用程序。该服务由AWS CloudWatch事件触发(固定速率为5分钟)。 但是,我发现有时服务会一次触发两次。我得到这个是因为有两个日志流打印了相同的数据和结果,但具有不同的Request estID。并且数据库有重复的数据,这表明两者都成功工作。看起来服务几乎无缘无故地同时触发了

  • 我通过infinispan缓存添加了CacheEntryExpired侦听器的n实现。addListener()方法。 侦听器事件在条目过期时激发。问题是,每次事件触发两次。 我验证(使用调试器和cache.getListeners())缓存不包含我的同一个侦听器的两个实例。getListeners的结果是: 所以只有一个听众。侦听器实现接口: 一个实现看起来像: 但是从接口中删除@CacheEn

  • 问题内容: 我尝试解除绑定click事件,但有时会触发两次,有时会触发5次!现在有点烦了! 来自的代码 更新 : 基本上我正在将以下代码 更多信息 : 这仅在我触发事件时发生,关闭模式对话框,然后使用其他对话框重新打开 数据结构: main.asp :负载> modal.asp :modal.asp包含上面的jquery +此页面上的两个div,其中包含panel1.asp和panel2.asp数

  • el-dropdown添加command事件,执行了两次,这是为什么? 查了别人的类似的两次触发问题,查文档证实,command为官方提供方法,不存在.native与二次同时被处罚的情况存在。

  • 我有一个 Blob 存储容器,其中配置了事件网格触发器(Blob 已创建)。我正在通过数据工厂加载此 blob 存储文件,很多时候,许多文件可能会在一次尝试中出现在此 blob 中。也许我们可以举一个20个文件的例子。 好消息是我的事件网格触发器启动了,函数app被调用。然而,我发现有时对于同一个文件,事件网格触发器被触发了不止一次。 在这20个文件中,很少有文件非常大,比如300 MB,但其他文