【问题标题】:EJB Injection failure on deploy部署时 EJB 注入失败
【发布时间】:2013-04-23 11:04:45
【问题描述】:

我遇到了 exxh EJB 的问题。

首先,我的设置:我使用的是 GlassFish 和 JEE6。我有一个打包为 WAR 的 REST-Service 和一个打包为 EJB-Jar 的 bean。它们不在 EAR 内。 应该通过@EJB 从 REST-WAR 使用 EJB,但是当我尝试部署 WAR 时,GlassFish 显示此错误:

部署时出错:

Exception while deploying the app [exx-upload-1.0] : Cannot resolve reference Local ejb-ref name=com.ex.exx.model.FileUpload/ocr,Local 3.x interface =com.ex.exx.api.IOCRService,ejb-link=null,lookup=,mappedName=,jndi-name=,refType=Session. Please see server.log for more details.

(之前部署的EJB没有任何错误)。

我不知道为什么。这是 EJB 代码:

界面:

@Local
public interface IOCRService {
    public String performOCRonImage(BufferedImage input);
}

和实施:

@Stateless
@LocalBean
public class OCRScanner implements IOCRService  {

    private Logger logger = Logger.getLogger(this.getClass().getName());
    private final static String NOT_RECOGNIZED = "Can not regocnize text";
    /**
     * Default constructor.
     */
    public OCRScanner() {
        logger.log(Level.INFO, "### OCR SCANNER BUILD" + this);
    }



    public String performOCRonImage(BufferedImage input) {
        logger.log(Level.INFO, "### OCR SCANNER CALLED" + this);
    }

    ...

这是战争中的重要部分:

public class FileUpload {
private final File PROPERTIES_FILE = new File(
        "fileUploadProperties.properties");
private final String PARAMETER_NAME = "file";
private final Logger logger = Logger.getLogger(this.getClass().getName());


@EJB
private IOCRService ocr;

public Response uploadFile(...) {
    // do some stuff
    logger.log(Level.INFO, "### EJB" + ocr.toString())
}

有什么建议吗?我在这里找不到我的失败。

【问题讨论】:

    标签: glassfish ejb code-injection


    【解决方案1】:

    通过将@Local 替换为@Remote 解决了这个问题。 这行得通,但是,我不满意,因为我不明白为什么。

    【讨论】:

      【解决方案2】:

      基本上,给定规范(例如,在tutorial 中解释),如果应用程序使用@Remote 装饰,则应用程序只能访问其他应用程序的 EJB。

      因此,您有 3 个选项:

      1. @Remote(你做了什么)装饰你的EJB,
      2. 将两者一起包装在一个耳朵内(因为它们将驻留在耳内) 然后相同的应用程序)。但是,如果您打算单独部署它们 应用程序甚至单独的服务器,请使用 1.)
      3. 将 CDI 与 @Inject 一起使用,但这仍然只会发现 EJB,如果 要么在同一个应用程序中,要么装饰为@Remote(如果不是)。

      HTH, 亚历克斯

      【讨论】:

        【解决方案3】:

        如果目标不是 EJB,则不应使用 @EJB。我想这是你的情况,因为你试图注入你的 WAR 中的一个类。

        改为使用:

        @Inject
        private IOCRService ocr;
        

        基本上,@Inject 在大多数情况下更好,因为:

        • 它更安全,
        • 它支持@Alternatives
        • 它知道注入对象的范围。

        【讨论】:

        • 感谢您的回答,但它是 EJB。以另一种方式解决了我的问题,将在一段时间内发布回复
        【解决方案4】:

        另一种解决方案是添加@Stateless(name=""),这种工作形式

        【讨论】:

          猜你喜欢
          • 2015-11-06
          • 2012-08-13
          • 2011-05-21
          • 2012-01-20
          • 2014-08-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多