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

micronaut@requestscope-不为每个传入的HTTP请求创建bean

卞安邦
2023-03-14

我有一个类,下面的类作为RequestScope bean

@RequestScope
class RequestContext {

  private String requestId;
  private String traceId; 
  private String authorisedId; 
  private String routeName; 
    
  // few more fields 

  @Inject RequestContext(SecurityContext securityContext) {
        this.requestId = UUID.randomUUID().toString();
        if(securityService.getAuthentication().isPresent()){
          this.authorisedId = (securityService
                              .getAuthentication().get()).getUserId().toString();
    }
  }
  
  /* to be updated in controller method interceptors */ 
  public void updateRouteName(String name){
      this.routeName = name; 
  }

共有1个答案

羊舌兴德
2023-03-14

什么时候由Micronaut构建?

在请求处理期间创建@requestscopebean,这是第一次需要bean。

是不变的吗?

package rscope;

import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;

@Controller("/")
public class DemoController {

    private final DemoBean demoBean;

    public DemoController(DemoBean demoBean) {
        this.demoBean = demoBean;
    }

    @Get("/doit")
    public String doit() {
        return String.format("Bean identity: %d", demoBean.getBeanIdentity());
    }
}

https://github.com/jeffbrown/rscope/blob/2935a4c1fc60f350198d7d3c1dbf9a7eedd333b3/src/main/java/rscope/demobean.java

package rscope;

import io.micronaut.runtime.http.scope.RequestScope;

@RequestScope
public class DemoBean {
    public DemoBean() {
    }

    public int getBeanIdentity() {
        return System.identityHashCode(this);
    }
}

https://github.com/jeffbrown/rscope/blob/2935a4c1fc60f350198d7d3c1dbf9a7eedd333b3/src/test/java/rscope/democontrollertest.java

package rscope;

import io.micronaut.http.client.RxHttpClient;
import io.micronaut.http.client.annotation.Client;
import io.micronaut.test.annotation.MicronautTest;
import org.junit.jupiter.api.Test;

import javax.inject.Inject;

import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;

@MicronautTest
public class DemoControllerTest {

    @Inject
    @Client("/")
    RxHttpClient client;

    @Test
    public void testIndex() throws Exception {
        // these will contain the identity of the the DemoBean used to handle these requests
        String firstResponse = client.toBlocking().retrieve("/doit");
        String secondResponse = client.toBlocking().retrieve("/doit");

        assertTrue(firstResponse.matches("^Bean identity: \\d*$"));
        assertTrue(secondResponse.matches("^Bean identity: \\d*$"));

        // if you modify DemoBean to be @Singleton instead of
        // @RequestScope, this will fail because the same instance
        // will be used for both requests
        assertNotEquals(firstResponse, secondResponse);
    }
}
 类似资料:
  • 问题内容: 我刚刚启动了一个简单的Java测试项目,该项目使用Hibernate管理某些实体,并提供REST接口来操纵这些对象并提供一些其他业务逻辑。REST接口是使用RESTEasy和Jetty创建的。 到目前为止,一切工作正常,但是我感觉我实际上写了太多样板代码。由于我在这些Java框架中没有太多经验,所以我只是想知道是否有人可以给我提示如何改善这种情况。 每个请求创建hibernate会话

  • 问题内容: 我有一堂课 不确定规范对HTTPServlet的回收有何评论:servlet容器是否应该在每个传入请求上创建此类的新实例,或者实现可以在请求之间重用类? 我正在调查一个有趣的问题,其中似乎是在GAE_SERVLETREQUESTServlet实例上创建的Map保持了请求之间的状态。 问题答案: 对于一般情况-非分布式,多线程的,可以保证只有servlet的一个实例。根据Servlet

  • 我有一个遗留的Java1.6运行localhostTomcat 7应用程序使用JSP页面,一个带有框架的框架集,javascript,但没有像Struts这样的框架。我使用请求或会话从servlet传递一个对象以在页面中显示,这很好。 然而,我最近做了一些更改,现在我无法从会话或请求中检索到相同的对象。它以前工作得很好,所以我不确定是什么坏了,但我甚至无法将字符串值从JSP返回到servlet。

  • 本文向大家介绍C#创建和发送HTTP GET请求,包括了C#创建和发送HTTP GET请求的使用技巧和注意事项,需要的朋友参考一下 示例            

  • 我不明白在spring mvc中使用dispatcher servlet只创建了一个bean对象,还是每个请求都创建了一个新对象? 控制器代码:- 在代码中,我在LoginBean对象中设置数据,并在方法abc中的modelandview对象中设置它。 然后,在jsp中,我没有为usename输入任何值,在这种情况下,当我提交表单并调用处理程序方法(initform)时,我试图打印相同的lb.ge

  • 问题内容: 让我们建立一个简单的例子: 我如何全局转换发送请求的URL?本质上,我想为每个http请求添加一个URL。 我尝试过的是在应用程序启动时在包含URL的位置设置变量。但这不是我想要我的代码看起来像的样子: 我是否应该考虑研究是否正确?谁能给我一些基本的示例代码? 问题答案: 我有另一种使用带有$ http的请求拦截器的方法,它将在一个公共位置处理所有url。