hkn*_*z47 2 java jpa spring-boot
Incompatible types. Required: ...model.Constants Found: java.util.Optional
jpa 方法上有红色下划线并带有消息:\n findById
。
我用findById
is here:
Constants constants=constantsRepository.findById(1L);\n
Run Code Online (Sandbox Code Playgroud)\n我的模型是:
\n@Id\n@GeneratedValue(strategy = GenerationType.IDENTITY)\n@Column(name = "pkid")\nprivate Long id;\n\npublic Long getId() {\n return id;\n}\n\npublic void setId(Long id) {\n this.id = id;\n}\n
Run Code Online (Sandbox Code Playgroud)\n有什么帮助吗?
\n这是我的所有代码
\n常量存储库接口
\npackage com.destek.salaryCalculation.repository;\n\nimport com.destek.salaryCalculation.model.Constants;\nimport org.springframework.data.jpa.repository.JpaRepository;\nimport org.springframework.stereotype.Repository;\n\n@Repository\npublic interface ConstantsRepository extends JpaRepository<Constants, Long>{\n\n}\n
Run Code Online (Sandbox Code Playgroud)\nBesCreateController java
\npackage com.destek.salaryCalculation.controller;\n\nimport com.destek.salaryCalculation.helper.BesCreateExcelHelper;\nimport com.destek.salaryCalculation.model.Personal;\nimport com.destek.salaryCalculation.repository.PersonalRepository;\nimport org.apache.poi.openxml4j.exceptions.InvalidFormatException;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\nimport javax.servlet.http.HttpServletResponse;\nimport java.io.IOException;\nimport java.util.List;\n\n@RestController\n@CrossOrigin(origins = "http://localhost:3000")\n@RequestMapping("/salarycalc")\npublic class BesCreateController {\n\n @Autowired\n private PersonalRepository personalRepository;\n\n @GetMapping("/besexcel/{group}")\n public void exportToExcelByGroup(HttpServletResponse response,@PathVariable String group) throws IOException, InvalidFormatException {\n response.setContentType("application/octet-stream");\n\n String headerKey = "Content-Disposition";\n String headerValue = "attachment; filename=bes.xlsx";\n response.setHeader(headerKey, headerValue);\n List<Personal> listPersonal = personalRepository.getListPersonelByGroup(group);\n System.out.println(listPersonal);\n BesCreateExcelHelper excelExporter = new \n BesCreateExcelHelper(listPersonal);\n excelExporter.export(response);\n }\n}\n
Run Code Online (Sandbox Code Playgroud)\n和 BesCreateHelper java
\npackage com.destek.salaryCalculation.helper;\n\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.IOException;\nimport java.util.Calendar;\nimport java.util.List;\nimport java.util.Optional;\nimport javax.servlet.ServletOutputStream;\nimport javax.servlet.http.HttpServletResponse;\nimport com.destek.salaryCalculation.model.Constants;\nimport com.destek.salaryCalculation.model.Personal;\nimport com.destek.salaryCalculation.repository.ConstantsRepository;\nimport org.apache.poi.openxml4j.exceptions.InvalidFormatException;\nimport org.apache.poi.ss.usermodel.*;\nimport org.apache.poi.xssf.usermodel.XSSFFont;\nimport org.apache.poi.xssf.usermodel.XSSFSheet;\nimport org.apache.poi.xssf.usermodel.XSSFWorkbook;\nimport org.springframework.beans.factory.annotation.Autowired;\n\npublic class BesCreateExcelHelper {\n private XSSFWorkbook workbook;\n private XSSFSheet sheet;\n private List<Personal> listPersonalBes;\n\n @Autowired\n private ConstantsRepository constantsRepository;\n public BesCreateExcelHelper(List<Personal> listPersonalBes) throws IOException, InvalidFormatException {\n FileInputStream inputStream = new FileInputStream(new File("bes.xlsx"));\n this.listPersonalBes = listPersonalBes;\n //workbook = new XSSFWorkbook();\n workbook = (XSSFWorkbook) WorkbookFactory.create(inputStream);\n sheet = workbook.getSheetAt(0);\n inputStream.close();\n }\n\n private void createCell(Row row, int columnCount, Object value, CellStyle style) {\n //sheet.autoSizeColumn(columnCount);\n Cell cell = row.createCell(columnCount);\n if (value instanceof Integer) {\n cell.setCellValue((Integer) value);\n } else if (value instanceof Boolean) {\n cell.setCellValue((Boolean) value);\n }else {\n cell.setCellValue((String) value);\n }\n cell.setCellStyle(style);\n }\n\n private void writeDataLines() {\n int rowCount = sheet.getLastRowNum();\n\n CellStyle style = workbook.createCellStyle();\n XSSFFont font = workbook.createFont();\n font.setFontHeight(15);\n style.setFont(font);\n\n Optional<Constants> constants2 = constantsRepository.findById(1L);\n Constants constants = constants2.orElseThrow(() ->new RuntimeException("No such data found"));;\n\n for (Personal personal : listPersonalBes) {\n Row row = sheet.createRow(++rowCount);\n int columnCount = 0;\n int i = 1;\n createCell(row, columnCount++, i++, style);\n createCell(row, columnCount++, personal.getName(), style);\n createCell(row, columnCount++, personal.getIdentity().toString(), style);\n double besAmount=0;\n if(personal.getBes()==1){\n int numberDayOfMonth=constants.getDayOfWork();\n int sanitaryPermit=personal.getSanitaryPermit();\n double grossWages=0;\n if(sanitaryPermit<numberDayOfMonth) {\n grossWages = constants.getDailyWage() * (numberDayOfMonth - sanitaryPermit);\n }\n float socialHelp=constants.getSocialHelp();\n float mealBonus=constants.getMealBonus();\n float tisSupport=constants.getTisSupport();\n double deservedVehicleHelp=0;\n if(numberDayOfMonth>0){\n int dayOfWork=numberDayOfMonth-sanitaryPermit-personal.getAnnualPermit();\n // TODO: 11.01.2021 busTicketHelp tekrar hesaplat\xc4\xb1lacak.\n double busTicketHelp=3.25*numberDayOfMonth;\n deservedVehicleHelp=busTicketHelp*dayOfWork/numberDayOfMonth;\n }\n double mealPrice=(constants.getDayOfWork()-(personal.getSanitaryPermit()- Math.floor(personal.getSanitaryPermit()/7)*2)-personal.getAnnualPermit())*constants.getMealBonus();\n double extraWorkHourPrice=Math.ceil(personal.getExtraWorkHour()*constants.getDailyWage()/5);\n double extraWorkHourPriceSpecial=Math.ceil(personal.getExtraWorkHourSpecial()*constants.getDailyWage()/7.5*1.5);\n double mealException=constants.getMinimumWage()/30*6/100*mealPrice;\n double sgkPrimBaseAmount=grossWages+socialHelp+mealBonus+tisSupport+deservedVehicleHelp+mealPrice+extraWorkHourPrice+extraWorkHourPriceSpecial+mealException;\n besAmount=sgkPrimBaseAmount*0.03;\n }\n createCell(row, columnCount++, String.valueOf(besAmount), style);\n }\n }\n public void export(HttpServletResponse response) throws IOException {\n //writeHeaderLine();\n writeDataLines();\n ServletOutputStream outputStream = response.getOutputStream();\n workbook.write(outputStream);\n // workbook.close();\n outputStream.close();\n }\n}\n
Run Code Online (Sandbox Code Playgroud)\n
正如 @AnishB 所说,您需要解析可选值,但我不会使用
... = constants.get();
Run Code Online (Sandbox Code Playgroud)
立即,因为这很危险,如果值不存在constants.get()
就会抛出NoSuchElementException
你应该使用:
Constants value = constants.orElse(null);
Run Code Online (Sandbox Code Playgroud)
甚至
Constants value = constants.orElseThrow(() -> new CustomException());
Run Code Online (Sandbox Code Playgroud)
这条线会抛出异常,但在这种情况下,你控制异常处理而不是幕后的东西
顺便说一句,NullPointerException
当尝试调用时 ,您会遇到一个问题constantsRepository.findById(1L);
,因为它BesCreateExcelHelper
不是 Spring 依赖项,因此您无法将其他 Spring 依赖项注入其中,在这种情况下constantsRepository
将为 null
您有 2 个选择:
#1,BesCreateExcelHelper
使用@Component
注释注释这将产生BesCreateExcelHelper
一个 spring 依赖项,因此constantsRepository
将正常注入,但是您必须将BesCreateExcelHelper
构造函数转换为方法,因为 Spring 从 4.3 版本开始使用构造函数来注入依赖项。
BesCreateExcelHelper 会像:
@Component
public class BesCreateExcelHelper {
...
public void init(List<Personal> listPersonalBes) { // notice this was the constructor logic
.......
}
}
Run Code Online (Sandbox Code Playgroud)
然后你注入BesCreateExcelHelper
并将BesCreateController
该..new BesCreateController()
行替换为besCreateExcelHelper.init(listPersonal)
#2你可以保持原样BesCreateExcelHelper
,但删除 Constant fetch 行并从外部传递常量值,当然这里的外部意味着其他一些 Spring 组件,就像你在控制器中所做的那样,exportToExcelByGroup
简单地你将在控制器中执行constantsRepository.findById(1L);
,然后将其作为第二个构造函数传递Helper 类的参数
...
constant = ...constantsRepository.findById(1L);
excelExporter = new
BesCreateExcelHelper(listPersonal, constant);
Run Code Online (Sandbox Code Playgroud)
我更喜欢第一个选项
归档时间: |
|
查看次数: |
5381 次 |
最近记录: |