user1805440
user1805440

Reputation: 21

How to use util.List in GWT RPC

I have this situation:

class User

@Entity
@Configurable(preConstruction=true)
public class User extends AbstractBussinessObject implements Serializable {
    @OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
    private List<Warrior> warriors;
...

class UserDto

public class UserDto extends AbstractDto implements Serializable{
    private List<WarriorDto> warriors;
    private String name;
    private String password;

    public UserDto() {}

    public UserDto(Long id, List<WarriorDto> warriors, String name, String password) {
        this.warriors = warriors;
        ...

class Warrior

@Entity
public class Warrior extends AbstractBussinessObject implements Serializable{
    @JoinColumn(name = "user_id")
    @ManyToOne
    private User user;
    ...

class WarriorDto

public class WarriorDto extends AbstractDto implements Serializable{
    private User user;
    ...

method in WarriorServiceImpl

@Transactional(readOnly = true)
public List<WarriorDto> getAllWarriors() {
    List<Warrior> wars = null;
    List<WarriorDto> warsDto = new ArrayList<WarriorDto>();
    try {
        wars = genericDao.getAll(Warrior.class);
        if (wars != null) {
            for (Warrior war : wars) {
                warsDto.add(createWarriorDto(war));
            }   
        }
    } catch (Exception e) {}
    return warsDto;
}

method in DAO

@SuppressWarnings("unchecked")
@Override
public <ENTITY> List<ENTITY> getAll(Class<ENTITY> clazz) {
    return getEntityManager().createQuery(
    "SELECT e FROM " + clazz.getSimpleName() + " e")
    .getResultList();
}

applicationContext.xml

<!-- Connection pool -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="${jdbc.driverClassName}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <property name="initialSize" value="2" />
        <property name="minIdle" value="2" />
    </bean>

    <bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="databasePlatform" value="${jpa.platform}" />
                <property name="generateDdl" value="true" />
                <property name="showSql" value="true" />
            </bean>
        </property>
        <property name="packagesToScan" value="cz.sutak.game" />
    </bean>

    <bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>

    <!-- Podpora deklarativni demarkace transakci - anotace @Transactional -->
    <tx:annotation-driven transaction-manager="txManager" mode="aspectj" />

    <bean id="transactionTemplate"
        class="org.springframework.transaction.support.TransactionTemplate">
        <property name="transactionManager">
            <ref bean="txManager" />
        </property>
    </bean>

complete code

https://github.com/sutakjakub/game

And if I want call WarriorService.Util.getInstance().getAllWarriors( new AsyncCallback<List<WarriorDto>>() in widgets it will failure with this message: com.google.gwt.user.client.rpc.StatusCodeException: 500 The call failed on the server; see server log for details. In Jetty is only this message: [ERROR] 500 - POST /game/warrior (127.0.0.1) 57 bytes

No error message more. Is problem in serialization (util.List)? Do u have some idea? Thank you very much.

EDIT: This is error message in terminal (sorry i didnt look that):

ERROR LazyInitializationException - failed to lazily initialize a collection of role: cz.sutak.game.client.bo.User.warriors, no session or session was closed

Upvotes: 0

Views: 409

Answers (2)

Suresh Atta
Suresh Atta

Reputation: 121998

Here As you said there is nothing to do with GWT,because its server side code.Even on clien side GWT supports Util.List.

And coming to the original problem.Its with the line wars = genericDao.getAll(Warrior.class);

while accessing this line there is no hibernate session opened.

Upvotes: 0

Anders R. Bystrup
Anders R. Bystrup

Reputation: 16060

The problem is that on the client side Hibernate has no way of fetching the attributes you marked with fetch = FetchType.LAZY. You either need to fetch them eagerly on the server side og null the Hibernate proxies before passing the object graph over the wire.

See my answer in another thread for tips on nulling Hibernate proxies.

Cheers,

Upvotes: 1

Related Questions