我是vaadin的新手,我试图用vaadin实现EclipseLink,在我的项目中我试图通过eclipselink从db获取状态列表并且我得到了结果设置在我的主文件中,但是当尝试将这些项目添加到表中时,使用每个循环我得到一个奇怪的错误
com.vaadin.server.ServiceException:java.lang.ClassCastException:com.example.dao.States无法强制转换为com.example.dao.States。
@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);
}
}
<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>
@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)
答案 0 :(得分:2)
尝试使用TypedQuery而不是Query:
TypedQuery q = em.createQuery(&#34;从States s&#34;,States.class中选择s); 列出stateList = q.getResultList();
另见:java.lang.ClassCastException: sametype cannot be cast to sametype 一些遇到此错误的人在重新启动服务器时已经清楚了。因此,请尝试清理构建,重新启动和重新部署。
答案 1 :(得分:1)
我猜问题可能在:
table.addContainerProperty("Population", Integer.class, null);
或
private String population;
请注意,填充具有不同的类型,因此查询从底层数据库获取字符串,然后循环尝试将它们作为整数值插入容器属性。
在实体中用String population
替换Integer population
似乎是最合理的选择。