【问题标题】:how to fix class java.util.LinkedHashMap cannot be cast to class java.lang.String error如何修复类 java.util.LinkedHashMap 无法转换为类 java.lang.String 错误
【发布时间】:2022-01-03 13:39:57
【问题描述】:

所以,我正在尝试构建一个报告。某些特定类型用户的详细信息需要写入 Excel 文件。在到达端点时,它返回 500 并带有以下堆栈跟踪。

java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class java.lang.String (java.util.LinkedHashMap and java.lang.String are in module java.base of loader 'bootstrap')
        at com.clever.bas.util.Helpers.lambda$writeToExcel$0(Helpers.java:73)
        at java.base/java.util.LinkedHashMap.forEach(LinkedHashMap.java:721)
        at com.clever.bas.util.Helpers.lambda$writeToExcel$1(Helpers.java:64)
     

这是抛出错误的辅助类

public static InputStream writeToExcel(Stream<UserProfile> data) throws Exception {

//        final Map<String, Transaction> transaction = data.collect(Collectors.toMap(Transaction::getId, Function.identity()));

//        System.out.println(transaction + " +++++>>>>>>");


        //Blank workbook
        try (XSSFWorkbook workbook = new XSSFWorkbook()) {

            //Create a blank sheet
            XSSFSheet sheet = workbook.createSheet("transaction report");


            AtomicInteger rowNum = new AtomicInteger(1);

            AtomicBoolean isHeaderSet = new AtomicBoolean(false);
            data.forEach(userProfile -> {
                if (!isHeaderSet.get()){
                    createHeader(userProfile, sheet);
                    isHeaderSet.set(true);
                }
                XSSFRow row = sheet.createRow(rowNum.getAndIncrement());

                ObjectMapper mapObject = new ObjectMapper();
                Map<String, Object> mapObj = mapObject.convertValue(userProfile, Map.class);


                AtomicInteger cellNum = new AtomicInteger();
                mapObj.forEach((key, value) -> {
                    XSSFCell cell = row.createCell(cellNum.getAndIncrement());
                    cell.setCellValue(key);
                    if (value instanceof Integer)
                        cell.setCellValue((Integer) value);
                    else if (value instanceof BigDecimal)
                        cell.setCellValue(((BigDecimal) value).doubleValue());
                    else if (value instanceof Long)
                        cell.setCellValue((Long) value);
                    else cell.setCellValue((String) value);

                });
            });

我已经检查了互联网,到目前为止我所看到的似乎都没有解决我的问题。模型中有一个 List 如下所示

public class UserProfile {


    @Id
    @ObjectId
    private String id;

    @JsonFormat(pattern="yyyy-MM-dd'T'HH:mm:ssZ")
    private final Date createdAt = new Date(System.currentTimeMillis());

    @JsonFormat(pattern="yyyy-MM-dd'T'HH:mm:ssZ")
    private final Date updatedAt = new Date(System.currentTimeMillis());


    private String agentId;

    @NotBlank
    private String firstName;

    @NotBlank
    private String lastName;

    @NotBlank
    @Email(message="Invalid email Address")
    private String email;

    @NotBlank
    @Size(min=11, max=14)
    private String phoneNumber;

    private String businessName;

    @Size(min=11, max=11)
    private String bvn;

    @Size(min=11, max=11)
    private String nin;

    @URL
    private String profilePicture;

    @URL
    private String utilityBill;

    @URL
    private String identityCard;

    private RoleGroup roleGroup;

    @Embedded
    private List<Role> roles;

    @ObjectId
    @JsonIgnore
    private List<String> roleIds;

    private String userType; // STAFF, AGENT, AGGREGATOR, PROSPECT

    public Types.Gender gender;

    private String referralCode;

    private String referral;

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
    private Date dateOfBirth;

    private Types.VerificationStatus verificationStatus;

    private Types.ApprovalStatus approvalStatus;

    private boolean enabled;

    private boolean verified = false;

    private String address;
    private String city;
    private String lga;
    private String state;
    private String terminalId;
    private String accountNumber;
    private Double msc;

    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    private String transactionPin;

    @Transient
    private boolean hasPin;


    public ClPrincipal toPrincipal() {
        ClPrincipal principal = new ClPrincipal();
        principal.setProfileId(this.id);
        principal.setUsername(this.email);
        principal.setFirstname(this.firstName);
        principal.setLastname(this.lastName);
        principal.setRoleGroup(this.roleGroup.getName());
        principal.setRoles(new ArrayList<>());
        return principal;
    }

    public UserByTerminalDTO toUserTerminalDto(){
        UserByTerminalDTO user = new UserByTerminalDTO();
        user.setUserID(this.id);
        user.setFirstName(this.firstName);
        user.setLastName(this.lastName);
        user.setMsc(this.msc);
        return user;
    }

    public String fullName(){
        return this.firstName + " " + this.lastName;
    }

    public boolean isHasPin() {
        return Objects.nonNull(this.transactionPin) && !this.transactionPin.trim().isEmpty();
    }

}

我想将这个模型 UserProfile 的一些详细信息写入 Excel 表并使其可供下载。你认为我如何解决问题。主要错误来自这些行,尤其是粗体字

AtomicInteger cellNum = new AtomicInteger();
                    mapObj.forEach((key, value) -> {
                        XSSFCell cell = row.createCell(cellNum.getAndIncrement());
                        cell.setCellValue(key);
                        if (value instanceof Integer)
                            cell.setCellValue((Integer) value);
                        else if (value instanceof BigDecimal)
                            cell.setCellValue(((BigDecimal) value).doubleValue());
                        else if (value instanceof Long)
                            cell.setCellValue((Long) value);
                        **else cell.setCellValue((String) value);**
    
                    });
                });

【问题讨论】:

  • Helpers 的第 73 行是什么?
  • @dan1st else cell.setCellValue((String) value);
  • 我认为你想要 cell.setCellValue(String.valueOf(value)); 或将其放在 else if (value instanceof String) 中,因为只有在 valueString 时才能进行强制转换。
  • @dan1st 谢谢。它解决了我的问题。

标签: java deserialization jackson-databind


【解决方案1】:

您假设对于 else 分支,value 只能是 String,但从错误看来它实际上是 LinkedHashMap

确保无论您使用什么数据,您还要处理valueMap 的情况并相应地编写。

【讨论】:

    猜你喜欢
    • 2021-04-22
    • 2019-05-17
    • 2019-09-05
    • 2019-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多