После того, как раскрывающийся список меняет состояние, я вызываю бизнес-уровень (управляемый компонент), мой уровень данных (компонент без состояния).
Между двумя компонентами объект Reader создается снова, и отсутствуют родительские поля (Reader расширяет пользователя).
public class PresentationBean implements Serializable{
private static final long serialVersionUID = 1L;
private LibraryService libraryService;
@PostConstruct
public void initialize() throws Exception{
// Create reference to book EJB using JNDI
InitialContext ctx = new InitialContext();
libraryService = (LibraryService)ctx
.lookup("java:global/Library-0.0.1/LibraryBean!library.libraryservice.LibraryService");
}
public Reader getReader(long Id) {
return libraryService.getReader(Id);
}
public void onSelectedReader(final AjaxBehaviorEvent event){
int selectedReader = Integer.parseInt((String) ((javax.faces.component.html.HtmlSelectOneMenu) event
.getSource()).getValue());
System.out.println("PA_DEBUG: Reader selected ajax: "+selectedReader);
Reader currentReader = libraryService.getReaderFromCardId(selectedReader);
System.out.println("PA_DEBUG:PresentationBean: Reader selected "+currentReader);
System.out.println("PA_DEBUG:PresentationBean: Reader selected cardId + Firstname "+currentReader.getCardId()+" "+currentReader.getFirstname());
bagService.setCurrentReader(currentReader);
}
Здесь слой данных
@Stateless
public class LibraryBean implements LibraryService{
@PersistenceContext(name = "LibraryPU")
private EntityManager em;
@Override
public Reader getReaderFromCardId(int cardId) {
System.out.println("PA_DEBUG:getReadFromCardId id: "+cardId);
Reader reader = (Reader) em.createQuery("FROM Reader r WHERE r.cardId = :cardId").setParameter("cardId", cardId).getSingleResult();
System.out.println("PA_DEBUG:getReadSQL id: "+cardId+" firstname "+reader.getFirstname());
System.out.println("PA_DEBUG:getReadSQL: Reader selected "+reader);
return reader;
}
}
Если мы посмотрим на трассировку отладок, то ясно увидим, что ссылка на объект меняется между компонентом и некоторыми параметрами, отчаивающимися.
20: 28: 25,352 INFO [стандартный вывод] (задание по умолчанию-38) PA_DEBUG: Reader
выбранный ajax: 1568963
20: 28: 25,352 INFO [стандартный вывод] (задание по умолчанию-38)
PA_DEBUG: getReadFromCardId id: 1568963
20: 28: 25,356 INFO [stdout] (задание по умолчанию-38) Hibernate: выберите
reader0_.email как email2_4_, reader0_.city as city3_4_,
reader0_.street as street4_4_, reader0_.zipCode as zipCode5_4_,
reader0_.firstname как firstnam6_4_, reader0_.lastname как фамилия7_4_,
reader0_.accountBalance как accountB8_4_, reader0_.cardId как cardId9_4_
от пользователя reader0_, где reader0_.DTYPE = 'Reader' и reader0_.cardId =?
20: 28: 25,358 INFO [стандартный вывод] (задание по умолчанию-38) PA_DEBUG: идентификатор getReadSQL:
1568963 имя Георгия
20: 28: 25,358 INFO [стандартный вывод] (задание по умолчанию-38) PA_DEBUG: getReadSQL:
Читатель выбрал library.businessobject.Reader@50ecfce2
20: 28: 25,359 INFO [stdout] (задание по умолчанию-38)
PA_DEBUG: PresentationBean: читатель выбран
library.businessobject.Reader@41bb1049
20: 28: 25,359 INFO [стандартный вывод] (задание по умолчанию-38)
PA_DEBUG: PresentationBean: выбранный читателем идентификатор карты + имя 1568963
пустой
Ссылка на полный код: https://github.com/PierreAnken/JavaEE
Есть подсказка?
Решение
Я использовал ObjectMapper для преобразования моих объектов в Map между бобами.
public Map<String, Object> convertToMap(){
ObjectMapper oMapper = new ObjectMapper();
Map<String, Object> readerMap = oMapper.convertValue(this, Map.class);
return readerMap;
}
public static Reader convertFromMap(Map<String, Object> readerMap){
ObjectMapper oMapper = new ObjectMapper();
Reader reader = oMapper.convertValue(readerMap, Reader.class);
return reader;
}