2015-07-10 4 views
0

У меня есть приложение EAR (для развертывания на Weblogic 12c), у которого есть компонент «persist». Компонент «persist» использует JPA (реализация: EclipseLink) для сохранения объектов.Администратор объектов JPA неправильно введен - Weblogic

Боб, который использует entityManager, объявлен как @Stateless, а администратор сущности вводится через аннотацию @PersistenceContext.

Проблема в том, что у меня есть NullPointerException каждый раз, когда я пытаюсь получить доступ к entityManager (что означает, что он не был правильно введен).

@Stateless 
@TransactionManagement(TransactionManagementType.CONTAINER) 
public class MyBean implements MyBeanLocal {  

    @PersistenceContext(unitName = "MyPersistenceUnit", type = PersistenceContextType.EXTENDED) 
    EntityManager entityManager; 

    public void insert(MyObject object) { 
     try { 
      entityManager.persist(object); //NullPointerException here 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

persistence.xml

<?xml version="1.0" encoding="UTF-8"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
       http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> 

    <persistence-unit name="MyPersistenceUnit" 
     transaction-type="JTA"> 
     <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
     <jta-data-source>MyDataSource</jta-data-source> 
     <class>com.myclasses.MyObject</class>> 
    </persistence-unit> 

</persistence> 

Я использую фабрику, чтобы получить экземпляр MyBean:

public class MyBeanFactory 
{ 
    public static MyBean create() 
    { 
     return new MyBean(); 
    } 
} 

И я использую его, как это в обычный код:

MyBeanLocal bean = MyBeanFactory.create(); 

MyBeanLo кал представляет собой интерфейс для MyBean, и он идет, как этот

@Local(MyBeanLocal.class) 
public interface MyBeanLocal { 
    public void insert(MyObject object); 
} 

Я попытался придать экземпляр MyBean через @EJB аннотацию, и он выходит из строя (NullPointerException всякий раз, когда я пытаюсь использовать якобы впрыскивается экземпляр MyBean)

Когда мое приложение развернуто на сервере Weblogic, я не вижу ни MyBean, ни MyPersistenceUnit в нем (я вижу MDB из других компонентов), хотя я могу видеть MyPersistenceUnit под номером Развертывания> «MyDomain»> Конфигурация/Настройки> Стойкость. MyDataSource в порядке и подключен.

Существует журнал запуска для сервера weblogic.

####<15 juil. 2015 09 h 52 CEST> <Notice> <Security> <MyUsername> <AdminServer> <[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1436946746252> <BEA-090082> <Security initializing using security realm myrealm.> 
####<15 juil. 2015 09 h 52 CEST> <Notice> <WebLogicServer> <MyUsername> <AdminServer> <[STANDBY] ExecuteThread: '3' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1436946771648> <BEA-000365> <Server state changed to STANDBY.> 
####<15 juil. 2015 09 h 52 CEST> <Notice> <WebLogicServer> <MyUsername> <AdminServer> <[STANDBY] ExecuteThread: '3' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1436946771650> <BEA-000365> <Server state changed to STARTING.> 
####<15 juil. 2015 09 h 53 CEST> <Warning> <EJB> <MyUsername> <AdminServer> <[ACTIVE] ExecuteThread: '3' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1436946795598> <BEA-012035> <The Remote interface method: public abstract boolean com.myclasses.UtilityRemote.send(com.mytypes.ReqType,java.lang.String) in EJB UtilityBean contains a parameter of type com.mytypes.ReqType which is not serializable. Though the EJB IMMJMSUtilityBean has call-by-reference set to false, this parameter is not serializable and hence will be passed by reference. A parameter can be passed using call-by-value only if the parameter type is serializable.> 
####<15 juil. 2015 09 h 53 CEST> <Notice> <Log Management> <MyUsername> <AdminServer> <[ACTIVE] ExecuteThread: '3' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1436946808540> <BEA-170027> <The server has successfully established a connection with the Domain level Diagnostic Service.> 
####<15 juil. 2015 09 h 53 CEST> <Notice> <WebLogicServer> <MyUsername> <AdminServer> <[STANDBY] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1436946809347> <BEA-000365> <Server state changed to ADMIN.> 
####<15 juil. 2015 09 h 53 CEST> <Notice> <WebLogicServer> <MyUsername> <AdminServer> <[STANDBY] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1436946809503> <BEA-000365> <Server state changed to RESUMING.> 
####<15 juil. 2015 09 h 53 CEST> <Notice> <Server> <MyUsername> <AdminServer> <[ACTIVE] ExecuteThread: '3' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1436946809774> <BEA-002613> <Channel "Default[1]" is now listening on 127.0.0.1:7001 for protocols iiop, t3, ldap, snmp, http.> 
####<15 juil. 2015 09 h 53 CEST> <Warning> <Server> <MyUsername> <AdminServer> <DynamicListenThread[Default]> <<WLS Kernel>> <> <> <1436946809774> <BEA-002611> <The hostname "MyUsername.MyProxy.com", maps to multiple IP addresses: 172.23.247.5, 0:0:0:0:0:0:0:1.> 
####<15 juil. 2015 09 h 53 CEST> <Notice> <Server> <MyUsername> <AdminServer> <[ACTIVE] ExecuteThread: '3' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1436946809775> <BEA-002613> <Channel "Default[2]" is now listening on 0:0:0:0:0:0:0:1:7001 for protocols iiop, t3, ldap, snmp, http.> 
####<15 juil. 2015 09 h 53 CEST> <Notice> <Server> <MyUsername> <AdminServer> <[ACTIVE] ExecuteThread: '3' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1436946809775> <BEA-002613> <Channel "Default" is now listening on 172.23.247.5:7001 for protocols iiop, t3, ldap, snmp, http.> 
####<15 juil. 2015 09 h 53 CEST> <Notice> <WebLogicServer> <MyUsername> <AdminServer> <[ACTIVE] ExecuteThread: '3' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1436946809776> <BEA-000331> <Started the WebLogic Server Administration Server "AdminServer" for domain "test" running in development mode.> 
####<15 juil. 2015 09 h 53 CEST> <Notice> <WebLogicServer> <MyUsername> <AdminServer> <[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1436946810276> <BEA-000360> <The server started in RUNNING mode.> 
####<15 juil. 2015 09 h 53 CEST> <Notice> <WebLogicServer> <MyUsername> <AdminServer> <[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1436946810280> <BEA-000365> <Server state changed to RUNNING.> 

Я подозреваю, что проблема в том, что этот компонент не корректно обрабатывается сервером WebLogic, но я понятия не имею, как это исправить.

Если бы кто-нибудь мог мне помочь, я был бы благодарен. Задайте мне больше кода/config/context, если вам нужно.

+0

Вы можете разместить код, который вы используете, чтобы получить MyBean экземпляр? Журнал запуска также может оказаться полезным, если мы сможем его подстроить, поскольку это похоже на то, что weblogic не может развернуть компонент. – hugh

+0

Я отредактировал исходное сообщение с запрошенной вами информацией, ничего не случилось в журнале автозагрузки – clapsus

ответ

1

Проблема заключается в том, как вы получаете ссылку EJB: если вы создаете экземпляр самостоятельно, используя «новое», то вы получите просто POJO, а не EJB - это означает, что вы не будете имеют доступ к любым службам EJB, таким как инъекция зависимостей и управление транзакциями.

Чтобы достать подлинный EJB, вы должны look up your bean in the initial context:

MyBeanRemote bean = (MyBeanRemote) new InitialContext().lookup("MyBean/remote"); 
+1

Либо будет работать (я только что использовал Remote, потому что это то, что есть в ссылке, и я ленив). Просто проверьте, правильно ли вы используете JNDI-поиск и кастинг для нужного вам типа. – hugh

+0

Извините, что я удалил свой комментарий («Работает ли он с местным или он должен быть удален») путем разборки. Проблема заключается в том, что MyBean, похоже, не развертывается на сервере weblogic, и поэтому я не могу ни увидеть его в дереве JNDI, ни искать его с помощью кода, который вы мне дали. Дело в том, что компоненты без состояния, объявленные в другом компоненте EAR (компонент EJB), должным образом развернуты, но не те, что содержатся в компоненте «PERSIST», хотя во время работы над Eclipse я вижу, что он узнайте фаны без состояния ([screenshot] (http://i.imgur.com/FPEU1za.png)). – clapsus

+0

Извините за двойной комментарий, на самом деле я решил проблему, добавив компонент «PERSIST» в качестве модуля EJB и используя «java: global.EARNAME.COMPONENETNAME.MyBean! Com.myclasses.MyBeanLocal», но у меня все еще есть EJB Exception' как 'Extended Persistence Contexts может быть вызван только из контекста сеансового компонента с состоянием, который объявляет расширенный контекст сохранения." В weblogic.persistence.ExtendedEntityManagerProxyImpl.getPersistenceContext (ExtendedEntityManagerProxyImpl.java:62) ' – clapsus

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