【问题标题】:Inject a singleton in an ExceptionMapper在 ExceptionMapper 中注入单例
【发布时间】:2014-02-10 16:18:25
【问题描述】:

我有一个 ExceptionMapper 定义如下

@Provider
public class MyExceptionMapper implements ExceptionMapper<Throwable> {
   @Inject
   private Manager myManager;

   @Override
   public Response toResponse(Throwable exception) {
      // My implementation
   }
}

在 glassfish 4 上部署此代码会导致异常:

org.glassfish.hk2.api.UnsatisfiedDependencyException: 
There was no object available for injection at
Injectee(requiredType=Manager,parent=MyExceptionMapper,qualifiers {}),position=-1,optional=false,self=false,unqualified=null,955636053)

当我使用 @Context 而不是 @Inject 时,我没有看到异常,但 myManager 为空 我尝试将 MyManager 设置为 @ManagedBean、@Singleton 或 EJB(无状态、单例)并且不起作用

【问题讨论】:

  • 感谢您的建议。但是建议的解决方案不太实用,因为我必须绑定我需要在 MyExceptionMapper 中注入的所有 CDI bean(以及依赖项)
  • 你在哪里部署? glassfish-4?
  • 你在创建 beans.xml 吗?没有它注入注解不起作用。
  • @Fedy2 它正在使用 glassfish 4.1.1

标签: java jersey jax-rs cdi


【解决方案1】:

在 JEE6(使用 glassfish 3)中,您必须添加

@javax.annotation.ManagedBean

到提供者实现。可能这也适用于 Glassfish 4

据我所知,这个问题来自以下几点。默认情况下,CDI 无法管理 RESTful 服务和提供者的依赖关系。但是在添加 @ManagedBean 时,您可以启用 CDI 来创建实例。

这是example,我在其中使用球衣向 CDI 介绍了一项宁静的服务。

【讨论】:

  • 感谢您的建议,但将 ManagedBean 添加到 ExceptionMapper 并没有帮助。
【解决方案2】:

您可以在此处https://java.net/jira/browse/JERSEY-2393关注有关此问题的更新

【讨论】:

    【解决方案3】:

    您可以使用 OmniFaces Beans 在您的 ExceptionMapper 中获取 CDI 托管 bean 实例:

    Beans.getInstance(Bean.class)
    

    我将它与包含 @javax.persistence.PersistenceContext@javax.ejb.Stateless bean 一起使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-23
      • 1970-01-01
      • 1970-01-01
      • 2015-05-12
      • 2019-04-28
      • 1970-01-01
      相关资源
      最近更新 更多