2014-02-19 4 views
1

У меня есть 6 войны проект Java EE, содержащий следующее:Инъекционное Stateless Local EJB (3.1) в @WebComponent в WebLogic 12c не работает

EJB-компонент объявлен так (это также служба JAX-RS):

@Path("/booksList") 

@Produces("application/json") 

@Stateless 

@LocalBean 

@Local(BooksListEJB.class) 

public class BooksListEJBImpl implements BooksListEJB 

WebComponent объявлен так:

@WebServlet(urlPatterns="/initDbData") 

public class DataInitListener extends HttpServlet { 

    @EJB 
    private BooksListEJB booksListEJB; 

пустой beans.xml файл в папку WEB-INF

Когда я развернуть его в WebLogic 12c, я получаю следующее сообщение об ошибке:

<Warning> <weblogic.jaxrs.onwls.deploy.ejb.provider.EJBComponentProviderFactory> <BEA-000000> <An instance of EJB class com.shivandragon.jee6TestService.ejb.impl.BooksListEJBImpl could not be looked up using simple form name. Attempting to look up using the fully-qualified form name. 
javax.naming.NameNotFoundException: While trying to look up comp/env/BooksListEJBImpl in /app/webapp/jee6Test-service-0.1-SNAPSHOT.war/2039754748.; remaining na 
me 'comp/env/BooksListEJBImpl' 
     at weblogic.jndi.internal.BasicNamingNode.newNameNotFoundException(BasicNamingNode.java:1180) 
     at weblogic.jndi.internal.ApplicationNamingNode.lookup(ApplicationNamingNode.java:146) 
     at weblogic.jndi.internal.WLEventContextImpl.lookup(WLEventContextImpl.java:253) 
     at weblogic.jndi.internal.WLContextImpl.lookup(WLContextImpl.java:426) 
     at weblogic.jndi.factories.java.ReadOnlyContextWrapper.lookup(ReadOnlyContextWrapper.java:45) 
     Truncated. see log file for complete stacktrace 

Я смотрел на подобные вопросы, и нашли предложение добавить @ManagedBean в сервлет. Пробовал это, но имел ту же ошибку.

Моего вопрос:

Не следует ли эта работа, я злоупотребляю некоторые Java EE 6 директивы/стандарт?

+0

Пожалуйста, удалите «@LocalBean» – Sam

+0

Если проблема не устранена, временно удалите аннотации Jax-RS. Для отладки. – Sam

ответ

1

В EJB 3.1 были добавлены новые виды Bean - LocaBean. Вы можете разработать компонент без необходимости внедрять какие-либо интерфейсы. Этот вид beans представляет собой «вид без интерфейса», аннотированный с помощью @LocalBean и вводимый классом. Существуют компоненты, которые реализуют некоторые локальные интерфейсы и имеют «локальное представление» и должны быть введены через локальный интерфейс. В вашем коде вы смешали bean-интерфейс и внешний интерфейс. Вы должны удалить аннотацию @LocalBean в ответ на @Sam.

Обновлено

Я проверить его на WebLogic Server 12.1.1.0.

Создание простой интерфейс с одним методом:

package ejbrest; 

public interface SessionEJBLocal { 
    public String hello(); 
} 

Затем создайте EJB с RESTful аннотаций:

package ejbrest; 

// ... imports 

@Path("/booksList") 
@Produces("application/json") 
@Stateless 
@Local(SessionEJBLocal.class) 
public class SessionEJBBean implements SessionEJBLocal { 
    public SessionEJBBean() { 
    } 

    @Override 
    @GET 
    public String hello() { 
     return "Hello, world"; 
    } 
} 

Дескриптор развертывания сети.XML (вы можете увидеть, что не имеет никаких определений сервлетов):

<?xml version = '1.0' encoding = 'UTF-8'?> 
<web-app xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    version="3.0">  
</web-app> 

Вы можете создать сервлет для местной инъекции боб демо:

package ejbrest; 

// ... imports 

@WebServlet(name = "DemoServlet", urlPatterns = { "/demoservlet" }) 
public class DemoServlet extends HttpServlet { 
    private static final String CONTENT_TYPE = "text/html; charset=UTF-8"; 

    @EJB 
    private SessionEJBLocal ejb; 

    public void doGet(HttpServletRequest request, 
     HttpServletResponse response) throws ServletException, IOException { 
     response.setContentType(CONTENT_TYPE); 
     PrintWriter out = response.getWriter(); 
     out.println("<html>"); 
     out.println("<head><title>DemoServlet</title></head>"); 
     out.println("<body>"); 
     out.println("<p>The servlet has received a GET. This is the reply: " + 
      ejb.hello() + "</p>"); 
     out.println("</body></html>"); 
     out.close(); 
    } 
} 

После развертывания вы можете попробовать позвонить своему RESTful услуги по URL:

http://[host]:[port]/[appcontext]/resources/booksList 

Ответ:

Hello, world 

Кроме того, ваш демо сервлет будет доступ к которой URL:

http://[host]:[port]/[appcontext]/demoservlet 

Ответ:

The servlet has received a GET. This is the reply:Hello, world 

По умолчанию Oracle WebLogic Server использовать resources в качестве ссылки на Джерси сервлета. Пожалуйста, прочитайте the official documentation для получения информации обо всех вариантах поддерживаемых вариантов развертывания.

+0

спасибо, вот и все. На самом деле я решил удалить [at] Local (BooksListEJB.class), а также тот факт, что класс EJB реализует этот интерфейс. Если я удалю [at] LocalBean из EJB, он больше не работает как служба JAX-RS (не уверен, что это нормально или является причудой WebLogic). В любом случае, вы были правы, используя [at] LocalBean и [at] Local на одном и том же EJB не имеет смысла. –

+0

Я попытался создать прототип, и он отлично работает для меня. Пожалуйста, прочитайте мое сообщение. – samolisov

+0

Большое спасибо за усилия и детали! Я пробовал что-то похожее на то, что вы предлагаете, и он отлично работает! –

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

  • Нет связанных вопросов^_^