【问题标题】:How to use util.List in GWT RPC如何在 GWT RPC 中使用 util.List
【发布时间】:2013-04-04 07:38:14
【问题描述】:

我有这种情况:

类用户

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

类 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;
        ...

类战士

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

类 WarriorDto

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

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;
}

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>

完整代码

https://github.com/sutakjakub/game

如果我想在小部件中调用WarriorService.Util.getInstance().getAllWarriors( new AsyncCallback<List<WarriorDto>>(),它将失败并显示以下消息:com.google.gwt.user.client.rpc.StatusCodeException: 500 The call failed on the server;有关详细信息,请参阅服务器日志。 在 Jetty 中只有这条消息:[ERROR] 500 - POST /game/warrior (127.0.0.1) 57 bytes

没有更多错误信息。 序列化(util.List)有问题吗?你有什么想法吗? 非常感谢。

编辑: 这是终端中的错误消息(抱歉,我没看到):

错误 LazyInitializationException - 无法延迟初始化角色集合:cz.sutak.game.client.bo.User.warriors,没有会话或会话已关闭

【问题讨论】:

    标签: java hibernate jpa gwt-rpc


    【解决方案1】:

    问题在于,在客户端,Hibernate 无法获取您用fetch = FetchType.LAZY 标记的属性。在通过网络传递对象图之前,您需要在服务器端急切地获取它们 og null Hibernate 代理。

    请参阅另一个线程中的 my answer,了解有关使 Hibernate 代理为空的提示。

    干杯,

    【讨论】:

    • EAGER 很有帮助......但我仍然有消息 com.google.gwt.user.client.rpc.StatusCodeException: 500 服务器上的调用失败;有关详细信息,请参阅服务器日志。在 Jetty 中只有这条消息:[ERROR] 500 - POST /game/warrior (127.0.0.1) 57 bytes
    • 恐怕您必须在服务器中设置断点和/或回调并从那里进行调试。
    • 在没有例如的情况下。 NPE 在您自己的代码中,我猜您图中的某些对象不是Serializable(休眠代理不是),这会导致您在使用 GWT 序列化程序类时遇到麻烦。尝试我链接到的方法,或使用例如。 Dozer 映射您的域对象。
    • 你能看看我的代码吗? github.com/sutakjakub/game我一无所知。
    【解决方案2】:

    这里正如你所说,与GWT无关,因为它的服务器端代码。即使在客户端GWT支持Util.List

    回到原来的问题。它与wars = genericDao.getAll(Warrior.class);这一行有关

    访问此行时没有打开hibernate session

    【讨论】:

    • 我正在使用 Spring ORM。这是我的 applicationContext.xml:添加顶部
    • Satus 代码 500 表示,在处理您从 GWT 请求的 RPC 时,服务器端发生了一些错误。您可以在错误日志中获取完整的堆栈跟踪
    • 这是pastebin.com/R21A7P5E 调用WarriorService.Util.getInstance().getAllWarriors( new AsyncCallback&lt;List&lt;WarriorDto&gt;&gt;() 后的日志。我不知道为什么它不起作用。我的测试没问题。但是在 rpc 调用中没有功能
    • 好吧..可能是我现在想的一个servlet路径..它触发了你的方法吗?
    • 我不知道trigerring到底是什么意思。但是唯一一种处理查询的方法是在这个问题的顶部。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多