docs: public void doAdd(@Param("submitKey") String submitKey, @FormGroup("dataMediaPairInfo") Group dataMediaPairInfo,
                        @FormField(name = "formDataMediaPairError", group = "dataMediaPairInfo") CustomErrors err,
                        Navigator nav) throws Exception {
          DataMediaPair dataMediaPair = new DataMediaPair();
          DataMedia sourceDataMedia = new DataMedia();
          DataMedia targetDataMedia = new DataMedia();
          dataMediaPairInfo.setProperties(dataMediaPair);
  
          // filter解析
          ExtensionDataType filterType = ExtensionDataType.valueOf(dataMediaPairInfo.getField("filterType").getStringValue());
          ExtensionData filterData = new ExtensionData();
          filterData.setExtensionDataType(filterType);
          if (filterType.isClazz()) {
              filterData.setClazzPath(dataMediaPairInfo.getField("filterText").getStringValue());
          } else if (filterType.isSource()) {
              filterData.setSourceText(dataMediaPairInfo.getField("filterText").getStringValue());
          }
          dataMediaPair.setFilterData(filterData);
  
          // fileresovler解析
          ExtensionDataType resolverType = ExtensionDataType.valueOf(dataMediaPairInfo.getField("resolverType").getStringValue());
          ExtensionData resolverData = new ExtensionData();
          resolverData.setExtensionDataType(resolverType);
          if (resolverType.isClazz()) {
              resolverData.setClazzPath(dataMediaPairInfo.getField("resolverText").getStringValue());
          } else if (resolverType.isSource()) {
              resolverData.setSourceText(dataMediaPairInfo.getField("resolverText").getStringValue());
          }
          dataMediaPair.setResolverData(resolverData);
          sourceDataMedia.setId(dataMediaPairInfo.getField("sourceDataMediaId").getLongValue());
          dataMediaPair.setSource(sourceDataMedia);
          targetDataMedia.setId(dataMediaPairInfo.getField("targetDataMediaId").getLongValue());
          dataMediaPair.setTarget(targetDataMedia);
          Long id = 0L;
          try {
              id = dataMediaPairService.createAndReturnId(dataMediaPair);
          } catch (RepeatConfigureException rce) {
              err.setMessage("invalidDataMediaPair");
              return;
          }
          if (submitKey.equals("保存")) {
              nav.redirectToLocation("dataMediaPairList.htm?pipelineId=" + dataMediaPair.getPipelineId());
          } else if (submitKey.equals("下一步")) {
              nav.redirectToLocation("addColumnPair.htm?dataMediaPairId=" + id + "&pipelineId="
                                     + dataMediaPair.getPipelineId() + "&dataMediaPairId=" + id + "&sourceMediaId="
                                     + sourceDataMedia.getId() + "&targetMediaId=" + targetDataMedia.getId());
          }
      }