![](/img/trans.png)
[英]java.lang.illegalargumentexception:cannot set a null TableModel
[英]Spring autowiring: Caused by: java.lang.IllegalArgumentException: Cannot set a null TableModel
我想从Main-GUI中打开一个带有JTable的JDialog。 为了在此JTable中显示数据,我有一个名为“ PvsTTableModel”的TableModel。
尝试在类“ KPI_PvsT”中设置表模型“模型”时将引发异常(第二个代码-此问题中的文本),尽管该异常应自动装配。
该对话框称为“ KPI_PvsT”,当有人单击菜单项“ itemPvsT”时会调用该对话框。
Main-GUI中还有更多可以正常工作的对象(它们能够成功地使用TableModels创建JDialogs-我已经将它们与我的对象进行了比较)。
我找不到由“ new”关键字创建的任何内容,这也可能是此处所述的问题。 一切都用“ @Component”和“ @Autowiring”注释。
这是我的表模型:
@Component
public class PvsTTableModel extends AbstractTableModel {
@Autowired
private TicketRepository ticketRepository;
@Autowired
private ResidentRepository residentRepository;
@Autowired
private ResidentSchichtRespository residentSchichtRepository;
@Autowired
private SchichtRepository schichtRepository;
private final String[] HEADER = {"Stunde", "Anzahl Mitarbeiter", "Anzahl offene Tickets"};
private Map<Integer, Integer> numberOfResidents = new HashMap<>();
private Map<Integer, Integer> numberOfOpenTickets = new HashMap<>();
@Override
public int getRowCount() {
return numberOfOpenTickets.size();
}
@Override
public int getColumnCount() {
return HEADER.length;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
switch(columnIndex){
case 0: return rowIndex;
case 1: return this.numberOfResidents.get(rowIndex);
case 2: return this.numberOfOpenTickets.get(rowIndex);
}
return null;
}
这是JDialog:
@Component
public class KPI_PvsT extends JDialog {
private JPanel contentPane;
private JButton buttonCancel;
private JTable table;
private JTextField tfDatum;
private JButton btOk;
@Autowired
private PvsTTableModel model;
public KPI_PvsT() {
setContentPane(contentPane);
setModal(true);
buttonCancel.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
onCancel();
}
});
// call onCancel() when cross is clicked
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
onCancel();
}
});
// call onCancel() on ESCAPE
contentPane.registerKeyboardAction(new ActionListener() {
public void actionPerformed(ActionEvent e) {
onCancel();
}
}, KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
table.setModel(model);
btOk.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String s = tfDatum.getText();
LocalDate date = null;
try{
date = LocalDate.parse(s, dtfLocalDate);
}catch(Exception ex){
JOptionPane.showMessageDialog(null, "Bitte geben Sie das Datum im richtigen Format ein!");
}
if(date != null){
model.fillMaps(date);
}
}
});
}
private void onOK() {
// add your code here
dispose();
}
private void onCancel() {
// add your code here if necessary
dispose();
}
public void init()
{
this.pack();
this.setVisible(true);
}
}
这是调用JDialog的GUI:
@Component
public class MainGUI extends JFrame{
@Autowired
private KPI_PvsT kpi_pvsT;
private JMenu menuHotline = new JMenu();
private JMenuItem itemPvsT = new JMenuItem();
public MainGUI() {
addListeners();
}
private void addListeners()
{
itemPvsT.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
kpi_pvsT.init();
}
});
}
public void starte(){
menuHotline.setText("Hotline");
itemPvsT.setText("Berechne Gegenüberstellung von Ticket und Personal");
}
}
错误堆栈跟踪
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'KPI_PvsT' defined in file [D:\HTBLA_Kaindorf\5AHIF\Diplomarbeit\Projekt\chantal_master\chantal\out\production\classes\com\chantal\gui\KPI_PvsT.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.chantal.gui.KPI_PvsT]: Constructor threw exception; nested exception is java.lang.IllegalArgumentException: Cannot set a null TableModel
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1155) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1099) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867) ~[spring-context-4.3.13.RELEASE.jar:4.3.13.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543) ~[spring-context-4.3.13.RELEASE.jar:4.3.13.RELEASE]
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) ~[spring-boot-1.5.9.RELEASE.jar:1.5.9.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693) ~[spring-boot-1.5.9.RELEASE.jar:1.5.9.RELEASE]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360) ~[spring-boot-1.5.9.RELEASE.jar:1.5.9.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:303) ~[spring-boot-1.5.9.RELEASE.jar:1.5.9.RELEASE]
at org.springframework.boot.builder.SpringApplicationBuilder.run(SpringApplicationBuilder.java:134) [spring-boot-1.5.9.RELEASE.jar:1.5.9.RELEASE]
at com.chantal.ChantalApplication.main(ChantalApplication.java:22) [classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_161]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_161]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_161]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_161]
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) [spring-boot-devtools-1.5.9.RELEASE.jar:1.5.9.RELEASE]
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.chantal.gui.KPI_PvsT]: Constructor threw exception; nested exception is java.lang.IllegalArgumentException: Cannot set a null TableModel
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:154) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE]
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:89) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1147) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE]
... 21 common frames omitted
Caused by: java.lang.IllegalArgumentException: Cannot set a null TableModel
at javax.swing.JTable.setModel(JTable.java:3678) ~[na:1.8.0_161]
at com.chantal.gui.KPI_PvsT.<init>(KPI_PvsT.java:49) ~[classes/:na]
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_161]
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_161]
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_161]
at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_161]
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:142) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE]
... 23 common frames omitted
正如@kdowbecki指出的那样,您在构造函数中使用的是自动装配的值“模型”,但是自动装配的值是在实例化AFTER对象后设置的,因此在构造时它仍为null。 您可能应该做的是将@Autowired注释设置为构造函数,并将模型作为构造函数参数。
//NOT Autowired
private PvsTTableModel model;
@Autowired
public KPI_PvsT(PvsTTableModel model) {
this.model = model;
[...]
}
仅供参考,构造函数自动装配是Spring现在推荐的注入方式,在Spring的最新版本中,甚至不需要构造函数上的@Autowired,因此类可以完全与DI无关。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.