2016-03-20 7 views
0

Я пытаюсь передать набор сущностей JPA от бизнес-уровня до уровня представления. Все развертывается на одном сервере приложений (Glassfish 4). Клиент развертывается как .war-файл, а Business Tier - как .ear с ejb, доступным через интерфейс Remote.Сущность JPA неправильно передается от EJB до уровня представления

Для этого у меня есть эти очень простые методы, с абсолютно никакой логики:

Client

public List<CompletedDesign> selectCompletedDesigns() { 
     try { 
      List<CompletedDesign> designs = customerFacade.selectCompletedDesigns(); 
      return designs; 
     } catch (EJBException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

И в EJB

// EJB 
@Override 
@RolesAllowed("customer") 
public List<CompletedDesign> selectCompletedDesigns() { 

    final Principal callerPrincipal = sessionCtx.getCallerPrincipal(); 

    String name = callerPrincipal.getName(); 
    Customer customer = dataXchangeBean.getCustomerByID(name); 
    List<CompletedDesign> cds = customerBean.selectCompletedDesigns(customer); 
    return cds; 
} 

Final это фрагмент JPA Entity ,

@Entity 
@Table(name = "COMPLETED_DESIGN") 
@NamedQueries({......}) 
public class CompletedDesign implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @Basic(optional = false) 
    @NotNull 
    @Size(min = 1, max = 20) 
    @Column(name = "ID") 
    private String id; 
    @Column(name = "DESCRIPTION") 
    private String description; 
    @Column(name = "NAME") 
    private String name; 
    @Column(name = "STATUS") 
    private DesignStatus status;  
    @JoinColumn(name = "CUSTOMER_FK", referencedColumnName = "ID") 
    @ManyToOne(optional = false, fetch = FetchType.LAZY) 
    private Customer customerFk; 
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "designFk", fetch = FetchType.LAZY) 
    private List<Product> products; 

Поставив точку останова можно увидеть cds список правильно извлекается в стороне EJB. Самый первый вопрос: почему я получаю вектор вместо списка? Я использую TypedQuery со стороны JPS, и это должно было правильно отобразить объект.

enter image description here

Однако моя основная проблема заключается в следующем: в последующей точке останова на самом клиентском классе в уровне представления, кажется, что он не может полностью восстановить объект, значения всего нуль, и типа отсутствует. Что мне здесь не хватает?

enter image description here

+0

Ненависть задать глупый вопрос, но вы получаете сообщение об ошибке при попытке получить доступ к Entity или это проблема IDE? –

+0

На самом деле, я обращаюсь к объекту со страницы JSF и с '# {finishedDesign.description}. Я тоже ничего не вижу на видео. Никакой ошибки на консоли. – Leonardo

+0

Ну, код, который вы показываете, должен быть из «ManagedBean», поддерживающего страницу, поскольку это метод. Я не понимаю аннотацию '@ Override' на EJB CustomerFacade. Разве это не '@ Безгражданство? –

ответ

0

Проведя несколько дней, пытаясь заставить его работать, я нашел это сообщение SO, которое приносит наиболее очевидное решение, ошибка с Glassfish и EclipseLink !!!

так пост: EclipseLink deserializes an empty entity object on remote EJB call

Исправлена ​​ошибка: eclipselink.weaving breaks marshalling out of the box

0

Вы используете отложенной загрузки, а это означает, связанные объекты будут загружены, когда вы обращаетесь к ним, а не тогда, когда первичный объект загружен (так что они не будут загружаться, если вы действительно не нужно их). Однако это не работает, когда основной объект отсоединяется от сеанса. Поэтому вы должны либо использовать EAGER вместо лени, либо просто загружать (получать доступ) коллекции, которые вам нужны внутри транзакции, перед передачей через удаленный интерфейс.

+0

uhm ... проблема не в связанном объекте, а в таких областях, как id, имя и т. Д., Это только свойства CompletedDesign – Leonardo