首页 > 解决方案 > 来自可选对象的实体 (Java 8)

问题描述

我在尝试从持有和可选的 ArrayList 中拉出实体时遇到一些问题。当我做一个断点时,我得到代码下方的返回。我知道我很接近,但缺乏关于如何将 GrandClientDataCore@9463 从返回给我的数据中提取出来的知识。

编辑以在 for 循环之前添加上一行。

Error occured: java.util.Optional cannot be cast to net.glmhc.dmhwebservices.entities.GrandClientDataCores. 
List<GrandClientDataCores> grandClientDataCoresList = getGrandClientDataCoreList(submitMode, grandClientDataCoreId);
for (GrandClientDataCores grandClientDataCores : grandClientDataCoresList) {
    CDCPAErrors request = new CDCPAErrors();
    request.setI(this.service.getRequestInfo(grandClientDataCores, submitMode, staff));
    logToFile(outDir, String.format("req_%s.xml", new Object[] {grandClientDataCores}), request);
    
    CDCPAErrorsResponse response = (CDCPAErrorsResponse) 
    getWebServiceTemplate().marshalSendAndReceive(getWebServiceUri(), request, 
    (WebServiceMessageCallback) new SoapActionCallback("http://tempuri.org/CDCPAErrors"));

    logToFile(outDir, String.format("res_%s.xml", new Object[] {grandClientDataCoreId}), response);
    DmhServicesCdcResponse responseObj = getResponse(submitMode, response);
    this.service.saveResponse(grandClientDataCores, submitMode, responseObj, staff);
    responses.add(responseObj);
}

这是 getGrandClientDataCoreList

 protected List<GrandClientDataCores> getGrandClientDataCoreList(SubmitMode submitMode, String grandClientDataCore) throws Exception {
        List<GrandClientDataCores> grandClientDataCoresList;
        try {
            grandClientDataCoresList = (List<GrandClientDataCores>) this.service.getGrandClientDataCoreList(submitMode, grandClientDataCore);
         } catch ( Exception ex) {
             throw new Exception(ex);
         }

         if (grandClientDataCore == null || grandClientDataCore.isEmpty()) {
             throw new NoDataException("No CDC record to validate.");

         }
        return grandClientDataCoresList;
    }

在此处输入图像描述

标签: javajava-8castingoptional

解决方案


您必须调用get()可选项来检索其值。你不能只是投射Optional<T>到别的东西上。根据调试图像,声明grandClientDataCoresList如下所示:

List<Optional<GrandClientDataCores>> grandClientDataCoresList ...

因此,您需要这样的东西:

for (Optional<GrandClientDataCores> gcdcOpt: grandClientDataCoresList) {
    GrandClientDataCores gcdc = gcdcOpt.get();
    ....

中的值grandClientDataCores属于Optional<GrandClientDataCores>.

您的实际错误在这里:

   protected List<GrandClientDataCores> getGrandClientDataCoreList(SubmitMode submitMode, String grandClientDataCore) throws Exception {
        List<GrandClientDataCores> grandClientDataCoresList;
        try {
            grandClientDataCoresList = (List<GrandClientDataCores>) this.service.getGrandClientDataCoreList(submitMode, grandClientDataCore);
                                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                                       This cast is invalid
                                       
         } catch ( Exception ex) {
             throw new Exception(ex);
         }

         if (grandClientDataCore == null || grandClientDataCore.isEmpty()) {
             throw new NoDataException("No CDC record to validate.");

         }
        return grandClientDataCoresList;
    }

你会发现返回的实际类型this.service.getGrandClientDataCoreList是 isList<Optional<GrandClientDataCores>>所以你必须在很多地方相应地更新你的代码。对于初学者...

   protected List<Optional<GrandClientDataCores>> getGrandClientDataCoreList(SubmitMode submitMode, String grandClientDataCore) throws Exception {
        List<Optional<GrandClientDataCores>> grandClientDataCoresList;
        try {
            grandClientDataCoresList = this.service.getGrandClientDataCoreList(submitMode, grandClientDataCore);
         } catch ( Exception ex) {
             throw new Exception(ex);
         }

         if (grandClientDataCore == null || grandClientDataCore.isEmpty()) {
             throw new NoDataException("No CDC record to validate.");

         }
        return grandClientDataCoresList;
    }

以及您调用此方法的任何地方。


推荐阅读