默认视图,若表单里面存在下拉组件,导入数据模板下载为空,0B,后台报错NullPointerException: null

问题描述:默认视图,若表单里面存在下拉组件,导入数据模板下载为空,0B,后台报错NullPointerException: null

2024-07-19 11:43:16.584 ERROR [DDMKFPT,AFCENTER,default,172.16.10.77:AFCENTER:28083,,,,] 931480 --- [EOS-Lowcode-Offline-Resource-Monitor] c.p.ext.common.service.TransactionUtil   : UserInfo: null, DataSourceInfo: [init=30, min=30, max=300, idle=null, busy=null, unclosedOrphaned=null], Thread: Thread[EOS-Lowcode-Offline-Resource-Monitor,10,main], CPU: 0%, SystemMemory: 44% [total:15776MB, free:8742MB, used:7034MB], JvmMemory: 24% [max:1963MB, total:1026MB, free:773MB, used:253MB]

org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is java.sql.SQLException: com.mchange.v2.c3p0.ComboPooledDataSource[ identityToken -> z8kfltb419qnp0kowop68|328572f0, dataSourceName -> z8kfltb419qnp0kowop68|328572f0 ] has been closed() -- you can no longer use it.

at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:313) ~[spring-jdbc-5.3.35.jar!/:5.3.35]

at org.springframework.transaction.support.AbstractPlatformTransactionManager.startTransaction(AbstractPlatformTransactionManager.java:400) ~[spring-tx-5.3.35.jar!/:5.3.35]

at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:373) ~[spring-tx-5.3.35.jar!/:5.3.35]

at com.primeton.common.transaction.impl.DefaultTransactionManager.begin(DefaultTransactionManager.java:82) ~[eos-ptp-jdbc-transaction-8.3.1.jar!/:na]

at com.primeton.common.transaction.impl.datasource.DataSourceTransactionManagerSetProvider$DataSourceTransactionManagerSet.beginTransactionManager(DataSourceTransactionManagerSetProvider.java:324) ~[eos-ptp-jdbc-transaction-8.3.1.jar!/:na]

at com.primeton.common.transaction.impl.datasource.DataSourceTransactionManagerSetProvider$DataSourceTransactionManagerSet.begin(DataSourceTransactionManagerSetProvider.java:295) ~[eos-ptp-jdbc-transaction-8.3.1.jar!/:na]

at com.primeton.ext.common.service.TransactionUtil$ThreadPoolExecutorWithTx$1.run(TransactionUtil.java:269) ~[eos-ptp-common-service-8.3.1.jar!/:na]

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_361]

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_361]

at java.lang.Thread.run(Thread.java:750) [na:1.8.0_361]

Caused by: java.sql.SQLException: com.mchange.v2.c3p0.ComboPooledDataSource[ identityToken -> z8kfltb419qnp0kowop68|328572f0, dataSourceName -> z8kfltb419qnp0kowop68|328572f0 ] has been closed() -- you can no longer use it.

at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.assertCpds(AbstractPoolBackedDataSource.java:512) ~[c3p0-0.9.5.4.jar!/:0.9.5.4]

at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getPoolManager(AbstractPoolBackedDataSource.java:524) ~[c3p0-0.9.5.4.jar!/:0.9.5.4]

at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:140) ~[c3p0-0.9.5.4.jar!/:0.9.5.4]

at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:269) ~[spring-jdbc-5.3.35.jar!/:5.3.35]

... 9 common frames omitted

解决方案:

脏数据导致,有重复code,只要有一条脏数据全部页面的模板导出都受影响,清理重复code后问题解决。

更多请参见EOS Low-Code Platform 8  

package com.example.kucun2.ui.jinhuo; import static android.content.ContentValues.TAG; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.RadioGroup; import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; import com.example.kucun2.R; import com.example.kucun2.entity.*; import com.example.kucun2.entity.data.Data; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Random; public class AddInventoryFragment extends Fragment { private Spinner spinnerDingdan, spinnerChanpin, spinnerZujian, spinnerBancai; private EditText etShuliang; private RadioGroup rgType; private Dingdan selectedDingdan; private Chanpin selectedChanpin; private Zujian selectedZujian; private Bancai selectedBancai; // 创建新订单产品组件按钮 private Button btnNewDingdan, btnAddChanpin, btnAddZujian, btnNewBancai; @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_add_inventory, container, false); // 初始化UI组件 spinnerDingdan = view.findViewById(R.id.spinner_dingdan); spinnerChanpin = view.findViewById(R.id.spinner_chanpin); spinnerZujian = view.findViewById(R.id.spinner_zujian); spinnerBancai = view.findViewById(R.id.spinner_bancai); etShuliang = view.findViewById(R.id.et_shuliang); rgType = view.findViewById(R.id.rg_type); Button btnSubmit = view.findViewById(R.id.btn_submit); // 初始化新按钮 btnNewDingdan = view.findViewById(R.id.btn_new_dingdan); btnAddChanpin = view.findViewById(R.id.btn_add_chanpin); btnAddZujian = view.findViewById(R.id.btn_add_zujian); btnNewBancai = view.findViewById(R.id.btn_new_bancai); // 设置按钮点击事件 btnNewDingdan.setOnClickListener(v -> createNewDingdan()); btnAddChanpin.setOnClickListener(v -> addChanpinToDingdan()); btnAddZujian.setOnClickListener(v -> addZujianToChanpin()); btnNewBancai.setOnClickListener(v -> createNewBancai()); // 设置订单选择器 setupDingdanSpinner(); // 提交按钮点击事件 btnSubmit.setOnClickListener(v -> addInventoryRecord()); return view; } private void setupDingdanSpinner() { // 定制订单适配器显示订单号(number) ArrayAdapter<Dingdan> dingdanAdapter = new ArrayAdapter<Dingdan>( requireContext(), android.R.layout.simple_spinner_item, Data.dingdans) { @NonNull @Override public View getView(int position, View convertView, @NonNull ViewGroup parent) { TextView textView = (TextView) super.getView(position, convertView, parent); Dingdan dingdan = getItem(position); if (dingdan != null) { textView.setText(dingdan.getNumber()); } return textView; } @Override public View getDropDownView(int position, View convertView, @NonNull ViewGroup parent) { TextView textView = (TextView) super.getDropDownView(position, convertView, parent); Dingdan dingdan = getItem(position); if (dingdan != null) { textView.setText(dingdan.getNumber()); } return textView; } }; dingdanAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinnerDingdan.setAdapter(dingdanAdapter); spinnerDingdan.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { selectedDingdan = (Dingdan) parent.getItemAtPosition(position); setupChanpinSpinner(selectedDingdan); } @Override public void onNothingSelected(AdapterView<?> parent) {} }); } private void setupChanpinSpinner(Dingdan dingdan) { // 获取该订单的产品列表 List<Chanpin> chanpins = new ArrayList<>(); for (Dingdan_Chanpin dc : dingdan.getChanpins()) { chanpins.add(dc.getChanpin()); } // 定制产品适配器显示产品名(name) ArrayAdapter<Chanpin> chanpinAdapter = new ArrayAdapter<Chanpin>( requireContext(), android.R.layout.simple_spinner_item, chanpins) { @NonNull @Override public View getView(int position, View convertView, @NonNull ViewGroup parent) { Log.d(TAG, "getView:position="+position+",convertView="+convertView+",parent="+parent); TextView textView = (TextView) super.getView(position, convertView, parent);//也是 convertView=null 就不报错 Chanpin chanpin = getItem(position); if (chanpin != null) { textView.setText(chanpin.getName()); } return textView; } @Override public View getDropDownView(int position, View convertView, @NonNull ViewGroup parent) { TextView textView = (TextView) super.getDropDownView(position, convertView, parent); Chanpin chanpin = getItem(position); if (chanpin != null) { textView.setText(chanpin.getName()); } return textView; } }; chanpinAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinnerChanpin.setAdapter(chanpinAdapter); spinnerChanpin.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { selectedChanpin = (Chanpin) parent.getItemAtPosition(position); setupZujianSpinner(selectedChanpin); } @Override public void onNothingSelected(AdapterView<?> parent) {} }); } private void setupZujianSpinner(Chanpin chanpin) { // 获取该产品的组件列表 List<Zujian> zujians = new ArrayList<>(); for (Chanpin_Zujian cz : chanpin.getZujians()) { zujians.add(cz.getZujian()); } // 定制组件适配器显示组件名(name) ArrayAdapter<Zujian> zujianAdapter = new ArrayAdapter<Zujian>( requireContext(), android.R.layout.simple_spinner_item, zujians) { @NonNull @Override public View getView(int position, View convertView, @NonNull ViewGroup parent) { Log.d(TAG, "getView:position="+position+",convertView="+convertView+",parent="+parent); TextView textView = (TextView) super.getView(position, convertView, parent);//也是 convertView=null 就不报错 Zujian zujian = getItem(position); if (zujian != null) { textView.setText(zujian.getName()); } return textView; } @Override public View getDropDownView(int position, View convertView, @NonNull ViewGroup parent) { TextView textView = (TextView) super.getDropDownView(position, convertView, parent); Zujian zujian = getItem(position); if (zujian != null) { textView.setText(zujian.getName()); } return textView; } }; zujianAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinnerZujian.setAdapter(zujianAdapter); spinnerZujian.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { selectedZujian = (Zujian) parent.getItemAtPosition(position); setupBancaiSpinner(selectedChanpin, selectedZujian); } @Override public void onNothingSelected(AdapterView<?> parent) {} }); } private void setupBancaiSpinner(Chanpin chanpin, Zujian zujian) { // 获取该组件关联的板材 List<Bancai> bancais = new ArrayList<>(); for (Chanpin_Zujian cz : chanpin.getZujians()) { if (cz.getZujian().getId().equals(zujian.getId())) { bancais.add(cz.getBancai()); } } // 定制板材适配器显示TableText(保持不变) ArrayAdapter<Bancai> bancaiAdapter = new ArrayAdapter<Bancai>( requireContext(), android.R.layout.simple_spinner_item, bancais) { @NonNull @Override public View getView(int position, View convertView, @NonNull ViewGroup parent) { Log.d(TAG, "getView:position="+position+",convertView="+convertView+",parent="+parent); TextView textView = (TextView) super.getView(position, convertView, parent);// 点击添加组件才会一直报 convertView=null java.lang.NullPointerException Bancai bancai = getItem(position); if (bancai != null) { textView.setText(bancai.TableText()); } return textView; } @Override public View getDropDownView(int position, View convertView, @NonNull ViewGroup parent) { TextView textView = (TextView) super.getDropDownView(position, convertView, parent); Bancai bancai = getItem(position); if (bancai != null) { textView.setText(bancai.TableText()); } return textView; } }; bancaiAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinnerBancai.setAdapter(bancaiAdapter); spinnerBancai.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { selectedBancai = (Bancai) parent.getItemAtPosition(position); } @Override public void onNothingSelected(AdapterView<?> parent) {} }); } // ... addInventoryRecord和createRecord方法保持不变 ... private void addInventoryRecord() { // 验证必填项 if (selectedDingdan == null || selectedChanpin == null || selectedZujian == null || selectedBancai == null) { Toast.makeText(getContext(), "请选择订单、产品、组件和板材", Toast.LENGTH_SHORT).show(); return; } String shuliangStr = etShuliang.getText().toString().trim(); if (shuliangStr.isEmpty()) { Toast.makeText(getContext(), "请输入数量", Toast.LENGTH_SHORT).show(); return; } // 解析数量 int shuliang; try { shuliang = Integer.parseInt(shuliangStr); } catch (NumberFormatException e) { Toast.makeText(getContext(), "请输入有效的数量", Toast.LENGTH_SHORT).show(); return; } // 确定操作类型(进货或消耗) boolean isJinhuo = rgType.getCheckedRadioButtonId() == R.id.rb_jinhuo; // 实际开发中应从登录信息获取当前用户 User currentUser = new User(1, "当前用户", "user", "password",1); // 创建记录 createRecord(selectedDingdan, selectedChanpin, selectedZujian, selectedBancai, shuliang, isJinhuo, currentUser); Toast.makeText(getContext(), "记录添加成功", Toast.LENGTH_SHORT).show(); etShuliang.setText(""); // 清输入框 } private void createRecord(Dingdan dingdan, Chanpin chanpin, Zujian zujian, Bancai bancai, int shuliang, boolean isJinhuo, User user) { if (isJinhuo) { // 创建进货记录 Jinhuo jinhuo = new Jinhuo(); jinhuo.setId(Data.jinhuoList.size() + 1); jinhuo.setDingdan(dingdan); jinhuo.setChanpin(chanpin); jinhuo.setZujian(zujian); jinhuo.setBancai(bancai); jinhuo.setShuliang(shuliang); jinhuo.setDate(new Date()); jinhuo.setUser(user); Data.jinhuoList.add(jinhuo); } else { // 消耗数量转为负数 shuliang = -shuliang; } // 更新库存 updateKucun(bancai, shuliang); } private void updateKucun(Bancai bancai, int changeAmount) { // 查找现有库存记录 for (Kucun k : Data.kucuns) { if (k.getBancai().getId().equals(bancai.getId())) { k.setShuliang(k.getShuliang() + changeAmount); return; } } // 如果没有找到库存记录,创建新的 Kucun newKucun = new Kucun(); newKucun.setId(Data.kucuns.size() + 1); newKucun.setBancai(bancai); newKucun.setShuliang(Math.max(changeAmount, 0)); // 确保不为负 Data.kucuns.add(newKucun); } // 新建订单方法 private void createNewDingdan() { // 创建新订单(示例:实际应弹窗或跳转页面) Dingdan newDingdan = new Dingdan(); newDingdan.setId( (Data.dingdans.size() + 1)); newDingdan.setNumber("新建订单" + System.currentTimeMillis()); newDingdan.setChanpins(new ArrayList<>()); Data.dingdans.add(newDingdan); // 刷新订单下拉框 setupDingdanSpinner(); spinnerDingdan.setSelection(Data.dingdans.size() - 1); Toast.makeText(getContext(), "新建订单成功", Toast.LENGTH_SHORT).show(); } // 为当前订单添加产品 private void addChanpinToDingdan() { if (selectedDingdan == null) { Toast.makeText(getContext(), "请先选择订单", Toast.LENGTH_SHORT).show(); return; } // 创建新产品(示例:实际应弹窗输入产品信息) Chanpin newChanpin = new Chanpin(); newChanpin.setId( (Data.chanpins.size() + 1)); newChanpin.setName("新产品" + System.currentTimeMillis()); newChanpin.setZujians(new ArrayList<>()); // 添加到全局列表 Data.chanpins.add(newChanpin); // 添加到当前订单的产品列表 Dingdan_Chanpin dc = new Dingdan_Chanpin(); dc.setId(selectedDingdan.getChanpins().size() + 1); dc.setChanpin(newChanpin); dc.setDingdan(selectedDingdan); selectedDingdan.getChanpins().add(dc); // 刷新产品下拉框 setupChanpinSpinner(selectedDingdan); spinnerChanpin.setSelection(selectedDingdan.getChanpins().size() - 1); Toast.makeText(getContext(), "产品添加成功", Toast.LENGTH_SHORT).show(); } // 为当前产品添加组件 private void addZujianToChanpin() { if (selectedChanpin == null) { Toast.makeText(getContext(), "请先选择产品", Toast.LENGTH_SHORT).show(); return; } // 创建新组件(示例) Zujian newZujian = new Zujian(); newZujian.setId( (Data.zujians.size() + 1)); newZujian.setName("新组件" + System.currentTimeMillis()); // 添加到全局列表 Data.zujians.add(newZujian); // 添加到当前产品的组件列表 Chanpin_Zujian cz = new Chanpin_Zujian(); cz.setId(selectedChanpin.getZujians().size() + 1); cz.setZujian(newZujian); cz.setChanpin(selectedChanpin); selectedChanpin.getZujians().add(cz); // 刷新组件下拉框 setupZujianSpinner(selectedChanpin); spinnerZujian.setSelection(selectedChanpin.getZujians().size() - 1); Toast.makeText(getContext(), "组件添加成功", Toast.LENGTH_SHORT).show(); } // 新建板材 private void createNewBancai() { // 创建新板材(示例) Random rand = new Random(12345); Bancai newBancai = new Bancai(); newBancai.setId((Data.bancais.size() + 1)); newBancai.setCaizhi(Data.bancais.get(rand.nextInt(Data.bancais.size()-1)).getCaizhi()); newBancai.setMupi1(Data.bancais.get(rand.nextInt(Data.bancais.size()-1)).getMupi1()); newBancai.setMupi2(Data.bancais.get(rand.nextInt(Data.bancais.size()-1)).getMupi2()); // 添加到全局列表 Data.bancais.add(newBancai); // 刷新板材下拉框 setupBancaiSpinner(selectedChanpin, selectedZujian); spinnerBancai.setSelection(Data.bancais.size() - 1); Toast.makeText(getContext(), "新建板材成功", Toast.LENGTH_SHORT).show(); } }
06-08
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值