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

如何在Spring中使用请求范围?

司马彦
2023-03-14
package test.service;

@Path("/test")
public class TestResource {

    @Inject
    private Query query;

    @GET
    public String test() {
        return "found: " + query.toString();
    }
}
package test.utils;

public class QueryFactory implements Factory<Query> {

    @Inject
    private UriInfo uriInfo;

    @Override
    public Query provide() {
        Query query = new Query();
        Iterator<String> it = uriInfo.getQueryParameters().keySet().iterator();

        if(it.hasNext()) {
            String key = it.next();
            List<String> valueList = uriInfo.getQueryParameters().get(key);
            String value;
            if(valueList.isEmpty())
                value = "no value";
            else
                value = valueList.get(0);

            query.setKey(key);
            query.setValue(value);
        } else {
            query.setKey("no query");
        }
        return query;
    }

    @Override
    public void dispose(Query query) {
    }
}
package test.config

@Configuration
@ComponentScan("test")
public class SpringConfiguration {

    @Autowired
    QueryFactory queryFactory;

    @Bean
    public Query query() throws Exception {
        return queryFactory.getObject();
    }
}
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>

<context-param>
    <param-name>contextClass</param-name>
    <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</context-param>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>test.config.SpringConfiguration</param-value>
</context-param>

更改TestResource

package test.service;

@Path("/test")
@Component
public class TestResource {

    @Autowired
    private Query query;

    @GET
    public String test() {
        return "found: " + query.toString();
    }
}

并向QueryFactory添加注释

@Component
@Scope("request")
public class QueryFactory implements FactoryBean<Query>

我理解使用请求范围需要RequestContextListener。然而,当我运行它时,我得到一个异常,它告诉我

`java.lang.IllegalStateException: No thread-bound request found:` 

我看不出哪里出了问题。你能给我指出这个配置应该如何正确地完成吗?

共有1个答案

宦翔
2023-03-14

问题是您告诉Spring QueryFactory有一个请求范围

@Component
@Scope("request")
public class QueryFactory

因此,这个objec只存在于web请求的中间。但您试图在web请求之外使用它。

@Autowired
QueryFactory queryFactory;

您可以在异常中看到它

 类似资料:
  • 基于CGLIB的请求范围bean的堆栈跟踪() 基于JDK-Dynamic-Proxy-Interface的请求范围bean的堆栈跟踪()

  • 问题内容: 我的网站上有视频倒带问题。 我想出了HTTP标头的问题。 我当前的控制器方法返回视频: 如何用字节范围支持重写以下代码? 聚苯乙烯 我看过以下示例http://balusc.blogspot.in/2009/02/fileservlet-supporting-resume- and.html 但是这段代码对我来说很难,我无法理解。我希望在春天mvc可以更简单地存在。 问题答案: 在回答

  • 我正在从请求OAuth2.0令牌。我正在请求以下范围: 我正在尝试同时获得Microsoft Graph范围和Office 365范围,但它给了我: AADSTS70011:为输入参数“scope”提供的值无效。范围https://graph.microsoft.com/User.Read https://graph.microsoft.com/Calendars.Read.Shared脱机访问配

  • 在我的Play(Java)框架项目中,我正在使用Guice进行依赖项注入,并且正在努力理解如何最好地将“会话”的概念与Guice和Play结合使用? 我知道Play是无状态的,除了可以在cookie中存储值之外,实际上没有会话的概念。我对Guice和Play的理解是,虽然Guice文档描述了支持不同的作用域(单例、会话、请求、无作用域),但因为我们正在用每个请求实例化一个新的注入器,所以仅适用于P

  • 问题内容: 我正在尝试在Spring中建立一个请求范围的bean。 我已经成功设置好了,所以每个请求创建一次bean。现在,它需要访问HttpServletRequest对象。 由于该bean是每个请求创建一次的,所以我认为容器可以轻松地将请求对象注入到我的bean中。我怎样才能做到这一点 ? 问题答案: 可以将请求范围的Bean与请求对象自动连接。

  • 我有一个web应用程序,它有一个Spring集成逻辑,在一个单独的线程中运行。问题是,在某个时候,我的Spring集成逻辑尝试使用请求范围的bean,然后我得到以下错误: 我有ContextLoaderListener设置: 我的作用域Bean是这样注释的(因为我听说代理我的Bean会有帮助): 我所做的可能吗?如果是,我在这里遗漏了什么?如果没有,关于我如何实现这一目标,还有其他建议吗?