Vaadin将List中的项目添加到vaadin表中

时间:2014-12-04 13:44:27

标签: java foreach vaadin

我是vaadin的新手,我试图用vaadin实现EclipseLink,在我的项目中我试图通过eclipselink从db获取状态列表并且我得到了结果设置在我的主文件中,但是当尝试将这些项目添加到表中时,使用每个循环我得到一个奇怪的错误

  

com.vaadin.server.ServiceException:java.lang.ClassCastException:com.example.dao.States无法强制转换为com.example.dao.States。

PFB代码片段

主Java文件:

@WebServlet(value = "/*", asyncSupported = true)
@VaadinServletConfiguration(productionMode = false, ui = VaadintestUI.class)
public static class Servlet extends VaadinServlet {
}
@Override
protected void init(VaadinRequest request) {

    final String PERSISTENCE_UNIT_NAME = "com.test.jpa";

    EntityManagerFactory factory;
    final VerticalLayout layout = new VerticalLayout();
    layout.setMargin(true);
    factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
    EntityManager em = factory.createEntityManager();
    Query q = em.createQuery("select s from States s");
    List<States> stateList = q.getResultList();
    System.out.println("Size: " + stateList.size());
    Table table = new Table("The US States");
    table.addContainerProperty("Name", String.class, null);

    table.addContainerProperty("Population", Integer.class, null);

    for (int i = 0; i < stateList.size(); i++) 
    {           
    table.addItem(new Object[]{ stateList.get(i).getState(),stateList.get(i).getPopulation()},i);
    }
    table.setPageLength(table.size());
    layout.addComponent(table);
}

}

Persitence.xml

  <persistence-unit name="com.test.jpa" transaction-type="RESOURCE_LOCAL">
    <class>com.example.dao.States</class>
    <properties>
      <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
      <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/testdb" />
      <property name="javax.persistence.jdbc.user" value="root" />
      <property name="javax.persistence.jdbc.password" value="root" />
    </properties>
  </persistence-unit>

States.java

@Entity
public class States {

    @Id
    private Long id;
    private String state;
    private String population;
    //Setters and getters//

堆栈跟踪引起:java.lang.ClassCastException:com.example.dao.States无法强制转换为com.example.dao.States        在com.example.vaadintest.VaadintestUI.init(VaadintestUI.java:69)        在com.vaadin.ui.UI.doInit(UI.java:645)       在com.vaadin.server.communication.UIInitHandler.getBrowserDetailsUI(UIInitHandler.java:222)       在com.vaadin.server.communication.UIInitHandler.synchronizedHandleRequest(UIInitHandler.java:74)       在com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:41)

2 个答案:

答案 0 :(得分:2)

  1. 尝试使用TypedQuery而不是Query:

    TypedQuery q = em.createQuery(&#34;从States s&#34;,States.class中选择s); 列出stateList = q.getResultList();

  2. 另见:java.lang.ClassCastException: sametype cannot be cast to sametype 一些遇到此错误的人在重新启动服务器时已经清楚了。因此,请尝试清理构建,重新启动和重新部署。

答案 1 :(得分:1)

我猜问题可能在:

table.addContainerProperty("Population", Integer.class, null);

private String population;

请注意,填充具有不同的类型,因此查询从底层数据库获取字符串,然后循环尝试将它们作为整数值插入容器属性。

在实体中用String population替换Integer population似乎是最合理的选择。