我正在从Spring Boot 1.5.21迁移到2.2.5,在此过程中也从Spring Boot云版本Edgware迁移。SR6到Hoxton。SR3。这一举动迫使我放弃了侦探自己的跟踪/跨度模型实现,并接受了勇敢的新模型。但是,我的控制器集成测试有问题。
我有一个名为Edge的微服务,其中有一个名为EdgeApplication的主类,我使用Spock作为测试框架。我的代码包括以下测试类:
@ContextConfiguration(classes = EdgeApplication.class)
@SpringBootTest(classes = EdgeApplication.class)
@ActiveProfiles(profiles = ["test"])
@AutoConfigureMockMvc
class VerificationCodeControllerSpecIT extends Specification {
@Autowired
MockMvc mockMvc
def setup() {
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build()
}
def "Generate change password verification code"() {
// Some code calling a PrincipalController via mockMvc.perform()
}
}
之前,在Spring Boot 1.5.21中,当调用到达PrincipalController时,初始化了带有span的默认跟踪上下文。现在,在Spring Boot 2中,情况并非如此。我必须强调,PrincipalController中这种缺乏上下文的情况只发生在测试代码中,而不是在实际运行的微服务中。
为什么这个行为改变了,我如何恢复旧的行为,即在调用控制器时有一个默认的跟踪上下文和跨度?
我添加了一个演示项目:演示您将能够运行联调,并在调试中看到控制器tracer.currentSpan()
为空(同时包含正常项目运行时的值)
如果它与Spring Security相关,也许您应该使用https://github.com/spring-projects/spring-security/blob/5.3.2.RELEASE/test/src/main/java/org/springframework/security/test/web/servlet/setup/SecurityMockMvcConfigurers.java。示例:
MockMvcBuilders.webAppContextSetup(this.wac)
.apply(SecurityMockMvcConfigurers.springSecurity())
.build();
在Spring Boot 1.5.21中,spring-cloud-sleuth的最新支持版本是1.3.6。发布。
在旧版本中,Sleuth使用拦截器:“TraceHandlerInterceptor”在Servlet调度器触发此拦截器时创建一个范围。
在1.5.21版运行Spring Boot测试时,触发上述拦截器的MockMvc init TestDispatcherServlet。
作为与Brave对齐的HTTP检测的一部分,此拦截器已被删除。
使用MockMvc时,需要显式配置过滤器链。您的MockMvc缺少TracingFilter
对于中继中的工作正常,但对于来自中继的,失败并显示错误消息(链接): 错误:未为此 lambda 函数捕获“此” 在命名空间范围内定义对两者都适用。 使用 lambda 捕获稍微修改的定义也适用于全局或本地范围。 哪个编译器是对的?
问题内容: 当搜寻通过Java语言规范来回答这个问题),我学到的是 在初始化类之前,必须先初始化其直接超类, 但不初始化由该类实现的接口。 同样,在初始化接口之前,不会初始化接口的超级接口。 出于我自己的好奇心,我尝试了一下,并且未如预期的那样对接口进行了初始化。 该程序打印 但是,如果接口声明了一个方法,则确实会发生初始化。考虑给定的接口 然后上面的相同程序将打印 换句话说,接口的字段已初始化(
问题内容: Log4j的默认初始化通过查找和使用URL进行配置的过程。然后,您如何找出最终使用的URL,而不必自己编写相同的过程?(如果您必须自己编写代码,则可能无法获得与log4j完全相同的代码,并且在将来的发行版中它可能会更改。) 问题答案: 如果您愿意使用AspectJ LTW(加载时编织),则可以看看Ian Roberts提到的静态初始化。在 log4j 1.2.14中, 它看起来像这样:
问题内容: 我有一个使用Angular Translate的应用程序(https://github.com/PascalPrecht/angular- translate )。Translate在浏览器中的应用程序中工作得很好,但是当我尝试测试任何控制器时,我得到 错误:意外的请求:GET locale / locale-en.json 。由于在启动时会翻译GET请求以获得语言文件,因此如何对控制
问题内容: 我有一个对象 我用两种方式初始化它 这是输出 似乎builder没有获得默认值。我在属性中添加了注释,对象现在看起来像这样 这是控制台输出 我怎样才能使他们俩都成为? 问题答案: 我的猜测是,这是不可能的(没有删除代码)。但是,为什么不仅仅实现所需的构造函数呢?Lombok旨在使您的生活更轻松,如果Lombok无法解决某些问题,请按照老式的方式进行操作。 控制台输出:
我有一个定义结构的swft框架: 但是,我似乎无法使用另一个导入库的项目中的隐式成员初始值设定项。错误为“CollectionTO”无法初始化,因为它没有可访问的初始化器。i、 它没有给默认的隐式成员初始化器public关键字。 我必须像这样添加我自己的init方法: ... 但如果有其他方法让人知道,我宁愿不要?