Spring RESTful Web服务和bean“请求”和“会话”范围

时间:2015-03-06 17:18:29

标签: java spring spring-mvc

我使用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配置?

1 个答案:

答案 0 :(得分:4)

报价

  

支持Web的Spring ApplicationContext实现

指的是WebApplicationContext的适当子类。您实例化的AnnotationConfigApplicationContext不是WebApplicationContext的子类型,并且未注册SESSIONREQUEST范围。

ApplicationContext中创建全新的@RestController也毫无意义。 @RestController对象已经是Spring WebApplicationContext中的bean。只需将您的新请求范围@Bean添加到该上下文并自动装入您的控制器。