2013-04-23 5 views
0

EJB가 exxh에 문제가 있습니다.배포시 EJB 주입 오류가 발생했습니다.

우선, 제 설정 : GlassFish & JEE6을 사용하고 있습니다. EJB와 Jar로 패키지 된 WAR와 Bean으로 패키지 된 REST-Service가있다. 그들은 EAR 안에 있지 않습니다. EJB를 @EJB를 통해 REST-WAR에서 사용해야하지만 GlassFish에서이 오류를 표시합니다.

배포하는 동안 오류가 발생했습니다 : [exx-upload-1.0] : 참조를 해석 할 수 없음 로컬 ejb-ref 이름 = com.ex.exx.model.FileUpload/ocr, 로컬 3.x 인터페이스 = com.ex.exx.api.IOCRService, ejb-link = null, lookup =, mappedName =, jndi-name =, refType = Session. 자세한 내용은 server.log를 참조하십시오.

(EJB는 오류없이 이전에 배포되었습니다.)

이유가 없습니다. 다음은 EJB 코드는 다음과 같습니다

인터페이스 :

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

및 구현 :

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

당신은 사용하지 말아야합니다 : 여기

@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); 
    } 

    ... 

그리고이 전쟁에서 중요한 부분입니다 @EJB 대상이 EJB가 아닌 경우 나는 당신이 당신의 WAR에있는 클래스에 주입하려고하기 때문에 당신의 경우라고 생각합니다.

대신 사용하기 때문에

@Inject 
private IOCRService ocr; 

기본적으로 @Inject는, 대부분의 경우에 더 나은 : 더 형태 보증은

  • ,
  • 가 @Alternatives을 지원
  • 가 인식 주입 된 객체의 범위.
+0

감사를했다지만, 그것은 EJB이다. 다른 방법으로 내 문제를 해결하고 잠시 후 응답을 게시합니다. – Mirco

2

기본적으로 사양 (예 : tutorial에서 설명)이 주어진 경우 응용 프로그램은 @Remote으로 꾸며져있는 경우 다른 응용 프로그램의 EJB에만 액세스 할 수 있습니다. (그들은 다음 동일한 응용 프로그램에 상주하는 것처럼) 모두 함께 귀 내부

  1. @Remote (당신이 한 일)하여 EJB를 장식,
  2. 패키지 :

    따라서, 당신은 3 가지 옵션이 있습니다 . 그러나 의도 당신에게하다면, 별도의 응용 프로그램 또는 별도의 서버에 배포 @Inject로 1)

  3. 사용 CDI를 사용하지만, 중 같은 응용 프로그램에서, 또는 @Remote 그렇지 않은 경우로 장식 된 경우이 여전히 단지 EJB를 발견 할 수 있습니다 .

HTH는 알렉스

-1

@Stateless(name="")을 추가 할 수있어 또 다른 해결책은,이 형태의 답변에 대한

관련 문제