Запросить через управляемые bean-объекты - PullRequest
0 голосов
/ 08 июня 2019

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

Между двумя компонентами объект 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;
    }
...