当前位置: 首页 > 知识库问答 >
问题:

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

金泉
2023-03-14

我使用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']

由于呼叫“/问候”

我在这里读了一些描述:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html然而,我仍然感到困惑。

他们写道:“请求、会话和全局会话作用域只有在使用web感知的Spring ApplicationContext实现时才可用”。

这是否意味着在这种情况下不允许使用我正在使用的“AnnotationConfigApplicationContext”?我是否被迫使用一些xml配置?

共有1个答案

韩善
2023-03-14

报价单

Web感知Spring Application Context实现

引用WebApplication ationContext的适当子类。您正在实例化一个AnnotationConfigApplication Context,它不是WebApplication ationContext的子类型,并且不注册SESSIONREQUEST范围。

在您的RestController中创建一个全新的应用程序上下文也没有什么意义。RestController对象已经是Spring中的bean了。只需将新的请求范围内的Bean添加到该上下文中,并自动连接到控制器中。

 类似资料:
  • 在请求范围中,bean被定义为HTTP请求,而在会话范围中,bean被定义为HTTP会话。例如, 如果bean范围是请求,并且用户在其用户会话中对网页发出多个请求,则在每个请求上都会创建一个新bean。 而如果范围被定义为bean的会话,如果用户多次请求网页,则在每次请求时都会返回相同的bean。 请让我知道这种理解是否正确?

  • 问题内容: 我正在使用请求模块(Python 2.5的版本0.10.0)。我已经弄清楚了如何将数据提交到网站上的登录表单并检索会话密钥,但是我看不到在后续请求中使用此会话密钥的明显方法。有人可以在下面的代码中填写省略号还是建议其他方法? 问题答案: 您可以使用以下方法轻松创建持久会话: 之后,请继续执行您的请求: 有关会话的更多信息,请访问:https : //requests.kennethre

  • 在用户登录时续订HTTP会话是常见的最佳做法。这将强制使用新的会话ID,从而避免会话固定漏洞。 当涉及@SessionScoped bean时,是否有使用CDI实现此功能的首选模式?困难在于,通过使当前HTTP会话无效,您将在下一个请求中获得不同的会话范围bean,但直到下一个请求。 例如,假设一个用于存储用户登录信息的会话bean: 和另一个用于管理登录的bean: 对于托管Bean,这将检索一

  • 每当我试图分析以了解Spring范围时,我都被困在某个地方。以下是我分析后的理解,在总结之前,我想和你确认一下。如果我的理解有误,请纠正我。 如果范围是“请求”,则对于来自客户端的每个新请求,无论会话如何,spring 容器都将生成新实例。一旦请求完成,Spring容器将设法关闭实例的生命周期。 如果范围是“会话”,则对于会话的第一个请求,Spring 容器将生成一个新实例,并为该特定会话的所有客

  • 问题内容: 有状态会话bean和HTTP会话之间有什么关系吗?我们将需要有状态会话Bean的用例是什么,而HTTP会话需要哪些用例。我可以将有状态会话Bean公开为静态Web服务吗? 问题答案: HTTP是一种无状态协议, 这意味着 它是服务器和客户端之间的实际传输协议- 是“无状态的, 因为它在调用之间不记得任何东西。 现在,首先阅读一下什么是HTTPSession和什么是Session Bea

  • 问题内容: 一个标准的案例-你有一个带有的控制器()。 通常希望实现会话中放置的类,以便在重新启动服务器的情况下可以物理存储它们,例如 如果控制器实现,这意味着它引用的所有服务(其他spring bean)也将被序列化。它们通常是代理,并引用事务管理器,实体管理器工厂等。 某些服务,甚至控制器,都不太可能通过实现实现对的引用,因此这可以有效地意味着整个上下文都已序列化。并且考虑到它拥有许多连接-即