Spring MVC集成测试弹簧安全问题,怎么解决
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring MVC集成测试弹簧安全问题,怎么解决相关的知识,希望对你有一定的参考价值。
参考技术A首先对于spring的IOC来说,对象是由Spring来帮我们管理,也就是在Spring启动的时候,在Spring容器中,由Spring给我们创建的,Spring会帮我们维护,一般都是单例的,也就是一个对象。
spring生成对象默认是单例的。通过scope属性可以更改为多例。
第一部分:验证Spring生成对象默认是单例的。
下面我们来一个网上的例子验证一下:
[html] view plain copy print?
<bean id="singleton" class="java.util.Date" scope="singleton"></bean>
<bean id="prototype" class="java.util.Date" scope="prototype"></bean>
[java] view plain copy print?package test;
import java.util.Date;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.opensymphony.xwork2.ActionContext;
public class TestScope
public static void main(String[] args)
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext-web.xml");
Date s1=(Date)context.getBean("singleton");
Date p1=(Date)context.getBean("prototype");
Date s2=(Date)context.getBean("singleton");
Date p2=(Date)context.getBean("prototype");
System.out.println("单例:"+(s1==s2));
System.out.println("非单例:"+(p1==p2));
输出结果:
结果
单例:true
非单例:false
注:复合数据类型的“== ”对比的是内存中存放的地址,所以此处我们采用“==”去对比
因为object中的equals初始行为是比较内存中的地址,但在一些类库中被覆盖掉了如(String,Integer,Date等)
第二部分:SpringMVC和Struts2中是并发访问否会存在线程安全问题。
对于使用过SpringMVC和Struts2的人来说,大家都知道SpringMVC是基于方法的拦截,而Struts2是基于类的拦截。
对于Struts2来说,因为每次处理一个请求,struts就会实例化一个对象;这样就不会有线程安全的问题了;
而Spring的controller默认是Singleton的,这意味着每一个request过来,系统都会用原有的instance去处理,这样导致两个结果:
一是我们不用每次创建Controller,二是减少了对象创建和垃圾收集的时间;由于只有一个Controller的instance,当多个线程调用它的时候,它里面的instance变量就不是线程安全的了,会发生窜数据的问题。
当然大多数情况下,我们根本不需要考虑线程安全的问题,比如dao,service等,除非在bean中声明了实例变量。因此,我们在使用spring mvc 的contrller时,应避免在controller中定义实例变量。
如:
public class Controller extends AbstractCommandController
protected Company company;
protected ModelAndView handle(HttpServletRequest request,HttpServletResponse response,Object command,BindException errors) throws Exception
company = ................;
解决方案:
有几种解决方法:
1、在Controller中使用ThreadLocal变量
2、在spring配置文件Controller中声明 scope="prototype",每次都创建新的controller
所在在使用spring开发web 时要注意,默认Controller、Dao、Service都是单例的。
例如:
[java] view plain copy print?@Controller
@RequestMapping("/fui")
public class FuiController extends SpringController
//这么定义的话就是单例
@Controller
@Scope("prototype")
@RequestMapping("/fui")
public class FuiController extends SpringController
//每次都创建
如何测试在弹簧集成中使用通道的热文件夹?
【中文标题】如何测试在弹簧集成中使用通道的热文件夹?【英文标题】:how to test a hotfolder that use channels in spring-integration? 【发布时间】:2019-06-10 22:15:36 【问题描述】:在 spring-integretion 项目中,我有一个热文件夹,用于检测何时将 csv 放入文件夹并做一些额外的事情,我有一个与通道连接的入站通道适配器。
入站通道适配器-> 通道。 检测其放置的 csv 何时收到与其连接的 mns 服务激活器 我要做什么测试只在创建文件时通道接收 mns
我正在使用本教程 https://www.javacodegeeks.com/2013/05/spring-integration-file-polling-and-tests.html 它非常有用,但我可以创建上下文
在允许 TestExecutionListener [org.springframework.test.context.support.DependencyInjectionTestExecutionListener@57a4d5ee] 准备测试实例 [proyect.integration.hotFolderTest@5af5def9] 时捕获异常 java.lang.IllegalStateException: 无法加载 ApplicationContext
【问题讨论】:
【参考方案1】:您需要显示更多有关此问题的堆栈跟踪,因为目前尚不清楚您的真正问题是什么。
也很高兴分享一些您目前拥有的代码以及您想在测试用例中做什么。
要验证通道中是否存在消息,您可以配置ChannelInterceptor
并实现其preSend()
。
但是,我们也建议使用 @SpringIntegrationTest
之类的 MockIntegration
功能。这样您就可以用一些MockIntegration.mockMessageHandler()
替换您的真实服务激活器并对其执行验证。
您需要在提到的注解上配置一个noAutoStartup
,直到您准备好模拟并调用this.mockIntegrationContext.substituteMessageHandlerFor()
,才轮询目录。
在参考手册中查看更多信息:https://docs.spring.io/spring-integration/docs/current/reference/html/testing.html#test-context
【讨论】:
嗨,现在我知道我的问题是,首先我需要验证所有上下文(我在 xml 中定义的)是否需要加载到我创建的测试类中与: >@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "/../resources/hot-folder.xml" ) Artem Bilan 你说得对,我的问题很笼统,那是因为我不知道我在做什么。 但问题是,使用 RunWith 指定 spring 的特殊运行器,使用 ContextConfiguration 指定加载上下文所需的位置或类,在我的情况下,我将路径中的所有 bean /../resources/hot-folder.xml 所以我可以在测试中使用,并且你必须在你带来你的上下文之前验证这个 bean 是否已经创建好以上是关于Spring MVC集成测试弹簧安全问题,怎么解决的主要内容,如果未能解决你的问题,请参考以下文章
Spring MVC 与 Spring Security 的集成测试