这就是我所拥有的,但Assert总是抛出AssertionException:
@Configuration
public class Config
@Bean
public HttpServletRequest request(){
HttpServleRequest mock = EasyMock.createMock(HttpServletRequest.class);
EasyMock.expect(mock.getParameter("test")).andReturn("123").anyTimes();
EasyMock.replay(mock);
return mock;
}
@Bean
MySerivce service(){
return new MyService();
}
@Bean
public ApplicationContextProvider context(){
return new ApplicationContextProvider();
}
}
这是服务MyService.java
:
public class MyService{
public void assertHasRequest(@Value("#{request}") HttpServletRequest request)){
assert request != null;
}
}
测试:TestExpressions.java
:
@RunWith(SpringJUnit4ClasssRunner.class)
@ContextConfiguration(classes=Config.class)
public class TestExpressions {
@Autowired
MyService service;
@Test
public void testService(){
service.assertHasRequest(null);
}
}
有什么想法吗?
答案 0 :(得分:2)
我担心你不能直接在方法参数上使用@Value
注释,以便在提供null时能够用默认值替换参数。
在您的情况下,@Value
注释与AutowiredAnnotationBeanPostProcessor一起使用,并且此处理器不监视方法参数级别上的@Value
注释。
您可以将@Value
置于方法级别,这将使Spring从上下文中注入HttpServletRequest
bean,但不会在每个请求中执行此操作:
public class MyService {
private HttpServletRequest request;
@Value("#{request}")
public void assertHasRequest(HttpServletRequest request) {
if (request != null) {
this.request = request;
}
assert this.request != null;
}
}
配置类:
@Configuration
public class Config {
@Bean
public HttpServletRequest request() {
HttpServletRequest mock = EasyMock.createMock(HttpServletRequest.class);
EasyMock.expect(mock.getParameter("test")).andReturn("123").anyTimes();
EasyMock.replay(mock);
return mock;
}
@Bean
MyService service() {
return new MyService();
}
}
测试类:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=Config.class)
public class TestExpressions {
@Autowired
MyService service;
@Test
public void testService(){
service.assertHasRequest(null);
}
}
在Spring MVC控制器中使用@Value
的行为会有所不同。
答案 1 :(得分:0)
@Value
并不意味着像这样使用。其主要目的是提供一种在自动装配发生时为注入字段指定默认值的方法。这一点很重要,因为您似乎希望在从代码中调用方法时使用@Value
,而当您调用该方法时,自动装配已经发生,并且您无法使用{{更改任何已经自动装配的字段1}}。 @Value
在实例创建时使用一次。
使用@Value
处理您需要的内容的最简单方法是:
@Value
在上面的代码中,当Spring创建public class MyService {
@Value("#{request}")
private HttpServletRequest request;
public void assertHasRequest() {// no parameters here because they don't act on local field this.request
assertNotNull(this.request);
}
}
类中指定的MyService实例时,它将检测Config
的使用以及何时创建@Value
(在您到达之前的方式)调用MyService
)它将注入它找到的assertHasRequest()
实例。
让我再举一个例子:
request
在此代码中,public class MyService {
private HttpServletRequest request;
public void assertHasRequest() {
assertNotNull(this.request);
}
@Value("#{request}")
private void initialize(HttpServletRequest request) {
System.out.println("initializing request");
this.request = request;
}
}
放置在方法@Value
上。创建initialize()
实例时,Spring容器会自动调用此方法,一次。这就像一个初始化方法,目的是设置字段MyService
。如果需要,您可以从代码中调用该方法,但它不起作用。 request
有意义让Spring知道在创建bean实例后要做什么。
对于放置在方法或构造函数的参数上的@Value
,需要使用@Value
:
@Autowired