不兼容的类型 - 发现 void java.util.Optional

hkn*_*z47 2 java jpa spring-boot

Incompatible types. Required: ...model.Constants Found: java.util.Optionaljpa 方法上有红色下划线并带有消息:\n findById

\n

我用findById is here:

\n
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

常量存储库接口

\n
package 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)\n

BesCreateController java

\n
package 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

\n
package 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

You*_*ans 5

正如 @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 个选择:

#1BesCreateExcelHelper使用@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 次

最近记录:

4 年,7 月 前