防止@EnableWebMvc注释的类被@ComponentScan拾取

2024-04-07

我有以下测试类:

@ActiveProfiles({ "DataTC", "test" })
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {BaseTestConfiguration.class, DataTestConfiguration.class, JpaConfiguration.class, PropertyPlaceholderConfiguration.class })
public class RegularDayToTimeSlotsTest {

    private static int NUMBER_OF_REGULAR_DAY_TO_TIME_SLOTS_IN_WEEK = 25;

    @Autowired
    private AdvertisementService advertisementService;

    @Test
    public void shouldNotContainSaturdayNorSunday() {
        Set<DayToTimeSlot> regularDayToTimeSlots = advertisementService.retrieveRegularDayToTimeSlots();
        assertThat(regularDayToTimeSlots).onProperty("day").excludes(Day.SATURDAY, Day.SUNDAY);
    }

    @Test
    public void shouldNotContainEveningNorNighttime() {
        Set<DayToTimeSlot> regularDayToTimeSlots = advertisementService.retrieveRegularDayToTimeSlots();
        assertThat(regularDayToTimeSlots).onProperty("timeSlot").excludes(TimeSlot.EVENING, TimeSlot.NIGHTTIME);
    }

    @Test
    public void shouldContainCorrectNumberOfDayToTimeSlots() {
        Set<DayToTimeSlot> regularDayToTimeSlots = advertisementService.retrieveRegularDayToTimeSlots();
        assertThat(regularDayToTimeSlots).hasSize(NUMBER_OF_REGULAR_DAY_TO_TIME_SLOTS_IN_WEEK);
    }
}

这是一个不需要任何ServletContext的集成测试。这是 BaseTestConfiguration 类:

@Configuration
@ComponentScan(basePackages = { "com.bignibou" }, excludeFilters = { @Filter(type = FilterType.CUSTOM, value = RooRegexFilter.class),
        @Filter(type = FilterType.ANNOTATION, value = Controller.class), @Filter(type = FilterType.ANNOTATION, value = ControllerAdvice.class),
        @Filter(type = FilterType.ANNOTATION, value = EnableWebMvc.class) })
public class BaseTestConfiguration {

}

这只是一个 java 配置类,旨在确保我的所有应用程序 bean 都已实例化并正确连接,但该类注释为@EnableWebMvc没有考虑在内,因为我不需要 Servlet 上下文来进行此集成测试。

不幸的是,无论我如何尝试排除 Web/Mvc 配置类,它都不起作用,并且@Configuration类注释为@EnableWebMvc也被拾起。

我得到这个异常:

Caused by: java.lang.IllegalArgumentException: A ServletContext is required to configure default servlet handling
    at org.springframework.util.Assert.notNull(Assert.java:112)
    at org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer.<init>(DefaultServletHandlerConfigurer.java:54)
    at org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport.defaultServletHandlerMapping(WebMvcConfigurationSupport.java:329)
    at org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration$$EnhancerByCGLIB$$d1263fa1.CGLIB$defaultServletHandlerMapping$22(<generated>)
    at org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration$$EnhancerByCGLIB$$d1263fa1$$FastClassByCGLIB$$e0423f09.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228)
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:326)
    at org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration$$EnhancerByCGLIB$$d1263fa1.defaultServletHandlerMapping(<generated>)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:166)
    ... 43 more

有人可以帮忙吗?


事实上,有一种更简洁的方法来配置此类集成测试。

答案在于适当的关注点分离,不仅在类级别,而且在包级别。

始终建议实现类和配置类都驻留在包层次结构中,以允许正确分离关注点。特别是对于 Web 应用程序,强烈建议确保 Web 组件和 Web 配置驻留在专用的“Web”包中。例如,您可以考虑类似于以下内容的包层次结构:

  • com.example.domain
  • com.example.service
  • com.example.repository
  • com.example.web

通过这样的层次结构,您可以通过以下方式简化组件扫描配置:包括仅那些与当前应用程序或测试场景相关的基础包。通过这样做,通常不需要使用排除过滤掉你不想要的东西。相反,只需指定您的包do want.

顺便说一下,指定"com.bignibou"因为你的基础包实际上是最糟糕的做法因为它是包罗万象的。

因此,尝试一下包含显式包的内容(而不是排除@Controller, @ControllerAdvice等),看看这是否不会让您的生活变得更轻松。 ;)

Regards,

Sam

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

防止@EnableWebMvc注释的类被@ComponentScan拾取 的相关文章

随机推荐

  • 如何使用 QtMqtt 和 SSL 执行安全 MQTT?

    我正在尝试使用 QtMQtt 示例项目 simpleclient 但我想执行安全的 MQTT 我该如何处理这个问题 我读过这篇博客 https www qt io blog 2017 08 14 introducing qtmqtt pro
  • 如何区分应用程序退出和系统关闭

    Mac OS X 上的 Java 在 Swing GUI 应用程序中 我想区分应用程序退出和系统关闭 在应用程序退出时 我想显示一个确认对话框 但是当用户选择 系统关闭 时 我只想退出应用程序 因为系统已经出现了一个确认对话框 这在其他平台
  • Python 中的意外列表行为

    我想颠倒一个列表 我成功地做到了 但在工作的过程中我发现了一些奇怪的事情 以下程序按预期工作 但未注释行list reversed i list len list 1 i and 打印 列表 i 评论最后一行当然 导致了改变list 我没看
  • 使用 setInterval() 后出现clearInterval() 未定义错误

    我知道这不应该是内联的 但 YUI 库的对话框迫使我这样做 我的问题是 每当我将鼠标悬停在该 div 上时 左边缘滚动就会激活 但当我将鼠标移出该 div 时 它不会停止 JS 控制台报告 未捕获的引用错误 timerID 未定义 这是代码
  • 如何从 MQTT 生产并在 ActiveMQ 中作为 MQTT 和 JMS 消费

    我有一个设置 其中消息作为 MQTT 生成到 ActiveMQ 我有两个消费者 一个作为 JMS 另一个作为 MQTT 当我将消息作为 JMS 消息发布到主题 foo 时 我在 JMS 和 MQTT 消费者处都收到消息 但是当我在同一主题上
  • make_shared真的比new更高效吗?

    我正在尝试shared ptr and make shared从 C 11 编写了一个小玩具示例来看看调用时实际发生了什么make shared 作为基础设施 我使用 llvm clang 3 0 以及 XCode4 中的 llvm std
  • 共享首选项和微调器不维护状态

    我有一个像这样的旋转器 Spinner 1 final Spinner plan Spinner dialog findViewById R id spinner1 strings getResources getStringArray R
  • Android - 使用外部浏览器在 WebView 中打开目标 _blank 链接

    我建立一个WebView显示一个网站 该网站包含无链接的链接target blank 属性和一些带有它的 我需要打开链接target在外部标准设备浏览器中定义的以及在 WebView 内部没有定义的 我正在使用一个WebViewClient
  • dart 中整数的最大值是多少?

    我到处都找过 但找不到与该主题相关的任何信息 另外 dart 中是否有类似 java 的 Long BigDecimal 数据类型 Dart 2 对于 dart2js 生成的 JavaScript Pixel Elephant 的答案仍然是
  • 在 ruby​​ 中处理大型 CSV 文件 (20G)

    我正在解决一个小问题 并会就如何解决它提供一些建议 给定一个列数和行数未知的 csv 文件 输出包含值的列列表以及每个值重复的次数 不使用任何库 如果文件很小 这应该不是问题 但是当它是几场演出时 我得到 NoMemoryError 无法分
  • 为什么静态方法需要包装到类中?

    对于这个问题的无知性质 我深表歉意 如果有一个简单的答案 只需一个解释链接就会让我非常高兴 经过 6 个月的编程后 我发现静态类对于存储适用于许多不同类的例程有点有用 这是我如何使用静态类的一个简化示例 它是一个用于将文本解析为各种内容的类
  • 如何在 Lighttable 中创建基本的 ClojureScript Hello World 应用程序?

    LightTable 中的文档似乎相当稀疏 我想在 LightTable 中创建一个非常简单的 ClojureScript Web 应用程序作为构建的起点 我让 Clojure 中的 Instarepl 工作正常 然后创建一个名为 dumm
  • 从计算机商店删除证书

    我很难让 powershell 删除意外安装到我们所有 Windows 7 计算机上的计算机商店的证书 作为示例 我提供了证书安装位置的屏幕截图 这不是实际的证书 我们有几百台机器 因此我们希望尽可能自动化地完成此操作 如果有人可以提供一种
  • 请识别此算法:数据流中的概率前 k 个元素

    我记得几年前听说过以下算法 但在网上找不到任何参考 它仅使用 m 个计数器来识别 n 个元素的数据流中的前 k 个元素 或重量级元素 这对于在使用最少内存的情况下查找热门搜索词 网络滥用者等特别有用 算法 对于每个元素 如果该元素还没有计数
  • 加速“最接近”字符串匹配算法

    我目前正在处理一个非常大的位置数据库 并尝试将它们与现实世界的坐标相匹配 为了实现这一点 我下载了地名数据集 https www geonames org export 其中包含很多条目 它给出了可能的名称和纬度 经度坐标 为了尝试加快该过
  • Java 相当于一个类。 == 与 .equals 相同

    我们可以做一个 on a Class变量而不是equals并期望相同的结果 例如 Class clazz xyz Case A if clazz Date class do something Case B if Date class eq
  • jqGrid 传递值到表单编辑

    我有一个 jqGrid 字段 如下所示 colModel name Enabled index Enabled width 45 editable true edittype checkbox editoptions value 1 0 f
  • 安装 laravel --prefer-dist

    我正在他们的网站上关注 Laravel 安装 我遇到了这条线 composer create project laravel laravel prefer dist 现在 到底是什么 prefer dist部分意思是 我在他们的文档中看不到
  • 使用 SpannedgridLayoutManager 后,recyclerView 占用了顶部的大量空间

    我想在 recyclerview 的 Spanned GridLayoutManager 中显示列表数据 但是添加辅助类 Spanned GridLayoutmanager 后 在我的 recycleview 中占用了顶部的大量空间 iam
  • 防止@EnableWebMvc注释的类被@ComponentScan拾取

    我有以下测试类 ActiveProfiles DataTC test RunWith SpringJUnit4ClassRunner class ContextConfiguration classes BaseTestConfigurat