0

我遇到了 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);
    }

    ...

这是 WAR 中的重要部分:

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())
}

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

4

4 回答 4

3

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

于 2013-04-23T12:18:43.490 回答
3

基本上,给定规范(例如,在教程中解释),一个应用程序只能访问其他应用程序的 EJB,如果它们用@Remote.

因此,您有 3 个选项:

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

HTH,亚历克斯

于 2014-11-12T09:55:19.150 回答
2

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

而是使用:

@Inject
private IOCRService ocr;

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

  • 它更安全,
  • 它支持@Alternatives
  • 它知道注入对象的范围。
于 2013-04-23T12:14:18.023 回答
-1

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

于 2017-10-10T20:25:24.620 回答