2013-04-23 8 views
0

У меня проблема с exxh EJB.EJB Ошибка впрыска при развертывании

Прежде всего, моя установка: я использую GlassFish & JEE6. Я получил REST-Service, упакованную как WAR, и фасоль, упакованную как EJB-Jar. Они не находятся в EAR. EJB должен использоваться из REST-WAR через @EJB, но когда я пытаюсь развернуть WAR, GlassFish показывает эту ошибку:

Ошибка при развертывании: Исключение при развертывании приложения [exx-upload-1.0] : Не удается разрешить ссылку 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-имя =, = переменная типа RefType Session. Дополнительную информацию см. На странице server.log.

(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()) 
    } 
Anny suggestions? I can not find my failure here. 

ответ

3

Решено, заменив @Local на @Remote. Это работает, однако, я не удовлетворен, поскольку я не понимаю, почему.

2

Вы не должны использовать @EJB, если цель не является EJB. Я думаю, это ваш случай, потому что вы пытаетесь ввести класс в свою ВОЙНУ.

Вместо этого используйте:

@Inject 
private IOCRService ocr; 

В принципе, @Inject лучше в большинстве случаев, потому что:

  • больше типизированного,
  • поддерживает @Alternatives
  • он знает объем вводимого объекта.
+0

Спасибо за ваш ответ, но это EJB. Решила мою проблему по-другому, опубликует ответ через некоторое время – Mirco

2

В принципе, учитывая спецификации (например, объясненные в tutorial), приложение может обращаться только к EJB другого приложения, если оно украшено @Remote.

Таким образом, у вас есть 3 варианта:

  1. украсят ваш EJB с @Remote (то, что вы сделали),
  2. пакет и вместе внутри уха (так как они будут находиться в одном приложении тогда) , Но если вы намерены развернуть их в отдельно приложений или даже отдельными серверами, используйте 1.)
  3. использовать CDI с @Inject, но это все равно будет только открыть EJB, если либо в том же приложении, или оформлен в виде @Remote, если не ,

НТН, Alex

-1

Другое решение это добавить @Stateless(name="") это срабатывало форма

Смежные вопросы