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

RequestScoped bean CDI上的HttpServletRequest注入

茹展鹏
2023-03-14
@RequestScoped
public class CurrentTransaction {

    private String user;
    private String token;

    @PersistenceContext(name="mysql")
    protected EntityManager em;

    @Inject HttpServletRequest request;

    public CurrentTransaction() {
        this.user = request.getHeader("user");
        this.token = request.getHeader("token");
    }

    //getters and setters ...
}
@Stateless
@Path("/areas")
public class AreasEndpoint {

   @PersistenceContext(unitName = "mysql")
   protected EntityManager em;

   @Inject
   protected CurrentTransaction current_user_service;

    @POST
    @Path("postman")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    @Authentication
    public Response create(AreaRequest request) {

        if (this.current_user_service.getUser() == null) {
            System.out.println("Go!!!");
            return Response.status(Status.FORBIDDEN).build();
        } else {
            System.out.println("---- user: " + this.current_user_service.getUser());
            System.out.println("---- token: " + this.current_user_service.getToken());
        }
    }

    // ...
}

CDI到达以执行CurrentTransaction类的构造函数。但是,HttpServletRequest请求字段未初始化(注入)。

我做错了什么?

共有1个答案

郏志学
2023-03-14

关于这个问题的一个最新答案--可能对其他读者有用:CDI中的依赖注入是按照以下顺序完成的:

  1. 调用构造函数
  2. 字段被注入
  3. 调用
  4. @PostConstruct带注释的方法

最后一点是您想要进一步初始化的地方,需要对注入的字段进行访问:

@Inject HttpServletRequest request;

public CurrentTransaction() {
    // field injection has not yet taken place here
}

@PostConstruct
public void init() {
    // the injected request is now available
    this.user = request.getHeader("user");
    this.token = request.getHeader("token");
}
 类似资料:
  • 问题内容: 我正在使用ejb 3并尝试@Inject HttpServletRequest,但是在部署时发生异常。 码: 例外: 我该怎么办? 问题答案: HttpServletRequest的生命周期由EJB / Web容器而不是CDI容器管理。尝试注入它会导致问题,因为通常会有很多接口实现,并且您的CDI容器没有足够的信息来决定要注入哪种实现。即使您成功注入了它的实例,它也 不会 与EJB容器

  • 问题内容: 我正在尝试按照此处的示例创建工厂以注入HttpSession。不幸的是,无论我尝试什么,都无法正常工作。不知道可能是什么问题。 我试过只注入HttpServletRequest和提供程序。这是我使用提供程序的示例。尝试在provide方法中访问提供程序时,该错误是空指针异常。如果我尝试注入HttpServletRequest,那么将无法获取任何对象。我正在使用JerseyTest在Gr

  • 我正在尝试将 HttpServlet 请求注入到我的泽西岛资源类中。我得到错误“”。我使用的是 Java 8。 据我所知,我正在做一个完全普通的球衣应用程序。以下是全部代码: 它阻塞了@Context HttpServletRequest部分。如果我将HttpServletRequest设置为一个字段,它将自动失败,请求为空。 以下是依赖关系。jersey.version为2.27: 这是完整的堆

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

  • 将HttpServletRequest或HttpServletResponse注入@RestController类中的@RequestMapping方法会导致异常(至少在@SpringBootTest注释启用测试中): 错误: 这是Spring的错误吗?我做错了吗?我几乎可以肯定地通过消除过程跟踪它到HttpServletRequest注入,而不是@Request estParamJSON(一种自