我使用spring指南中的简单REST服务的纯示例代码作为基础: http://spring.io/guides/gs/rest-service/
我添加了单Bean配置:
@Configuration
public class Config {
@Bean
@Scope(value = WebApplicationContext.SCOPE_REQUEST)
public RequestData requestHelper() {
return new RequestData();
}
}
然后我的修改后的控制器如下所示:
@RestController
public class GreetingController {
private static final String template = "Hello, %s!";
private final AtomicLong counter = new AtomicLong();
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Config.class);
@RequestMapping("/greeting")
public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) {
System.out.println(applicationContext.getBean(RequestData.class));
return new Greeting(counter.incrementAndGet(),
String.format(template, name));
}
}
我正在
java.lang.IllegalStateException: No Scope registered for scope 'session']
作为调用“/ greeting”的结果
我在这里读了一些描述: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html但我仍感到困惑。
他们写道: “请求,会话和全局会话范围仅在您使用Web感知的Spring ApplicationContext实现时才可用。”这是否意味着在这种情况下我不允许使用“AnnotationConfigApplicationContext”?我是否被迫使用某些xml配置?
答案 0 :(得分:4)
报价
支持Web的Spring ApplicationContext实现
指的是WebApplicationContext
的适当子类。您实例化的AnnotationConfigApplicationContext
不是WebApplicationContext
的子类型,并且未注册SESSION
和REQUEST
范围。
在ApplicationContext
中创建全新的@RestController
也毫无意义。 @RestController
对象已经是Spring WebApplicationContext
中的bean。只需将您的新请求范围@Bean
添加到该上下文并自动装入您的控制器。