Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 构建没有属性文件的JCoServer_Java_Properties_Connection_Sap_Jco - Fatal编程技术网

Java 构建没有属性文件的JCoServer

Java 构建没有属性文件的JCoServer,java,properties,connection,sap,jco,Java,Properties,Connection,Sap,Jco,我又问了一个与JCo有关的问题,希望能找到帮助 使用JCo,您可以轻松建立连接,就像JCo库附带的示例表中所解释的那样。不幸的是,构建连接的唯一方法是使用创建的属性文件。如果没有任何合理的数据,情况也不会那么糟。但至少,SAP用户的密码存在于文件中,因此这种连接处理方式缺乏安全性。JCo的手册也这么说: “在本例中,目标配置存储在程序调用的文件中。实际上,出于安全原因,您应该避免这样做。” 但毕竟找不到有效的解决方案。关于这个主题有很多线索,像这样 但是没有一个是有用的。我真的想不出解决办法,

我又问了一个与JCo有关的问题,希望能找到帮助

使用JCo,您可以轻松建立连接,就像JCo库附带的示例表中所解释的那样。不幸的是,构建连接的唯一方法是使用创建的属性文件。如果没有任何合理的数据,情况也不会那么糟。但至少,SAP用户的密码存在于文件中,因此这种连接处理方式缺乏安全性。JCo的手册也这么说:

“在本例中,目标配置存储在程序调用的文件中。实际上,出于安全原因,您应该避免这样做。”

但毕竟找不到有效的解决方案。关于这个主题有很多线索,像这样

但是没有一个是有用的。我真的想不出解决办法,也找不到。实际上,我解决了在建立连接后删除文件的安全问题,但这不是一个令人满意的解决方案。必须有更好的方法获取连接的参数,特别是当它出现在手册中时,但我没有办法


有人已经使用过JCo 3.0并且知道这个问题吗?

是的,这是可能的。您必须创建自己的DestinationDataProvider实现,并使用Environment.registerDestinationDataProvider()注册它。但是,您的DDP获取连接数据和凭据取决于您。看一看,这里有一个有效的例子

你需要

  • 从第66行开始复制私有类,并使其适应您自己的需要(即,从您想要的任何地方获取连接数据)
  • 在应用程序启动期间的某个地方执行注册(第204行)
  • 使用将传递给DestinationDataProvider的字符串标识符获取连接

    • 这有点让人困惑,我也很难理解这一点

      您只需要一个java.util.Properties类型的对象来填充所需的字段,但如何填充该对象则取决于您自己

      我通过ValueObject编辑它,我可以从文件、数据库、web表单填写此VO

          JCOProvider jcoProvider = null;
          SAPVO sap = new SAPVO(); // Value Object
          Properties properties = new Properties();
      
          if(jcoProvider == null) {
      
      
              // Get SAP config from DB
              try {
                  sap = SAPDAO.getSAPConfig(); // DAO object that gets conn data from DB
              } catch (Exception ex) {
                  throw new ConexionSAPException(ex.getMessage());
              }
      
               // Create new conn
              jcoProvider = new JCOProvider();
      
          }
      
          properties.setProperty(DestinationDataProvider.JCO_ASHOST,        sap.getJCO_ASHOST());
          properties.setProperty(DestinationDataProvider.JCO_SYSNR,         sap.getJCO_SYSNR());
          properties.setProperty(DestinationDataProvider.JCO_CLIENT,        sap.getJCO_CLIENT());
          properties.setProperty(DestinationDataProvider.JCO_USER,          sap.getJCO_USER());
          properties.setProperty(DestinationDataProvider.JCO_PASSWD,        sap.getJCO_PASSWD());
          properties.setProperty(DestinationDataProvider.JCO_LANG,          sap.getJCO_LANG());
      //    properties.setProperty(DestinationDataProvider.JCO_TRACE,         "10");
      
          try {
      
              jcoProvider.changePropertiesForABAP_AS(properties);
      
          } catch (Exception e) {
      
              throw new ConexionSAPException(e.getMessage());
      
          }
      
      JCOProvider类:

      import com.sap.conn.jco.ext.DestinationDataEventListener;
      import com.sap.conn.jco.ext.DestinationDataProvider;
      import com.sap.conn.jco.ext.Environment;
      import es.grupotec.ejb.util.ConexionSAPException;
      import java.util.Properties;
      
      public class JCOProvider implements DestinationDataProvider {
      
          private String SAP_SERVER = "SAPSERVER";
          private DestinationDataEventListener eventListener;
          private Properties ABAP_AS_properties;
      
          public JCOProvider() {
          }
      
          @Override
          public Properties getDestinationProperties(String name) {
      
              if (name.equals(SAP_SERVER) && ABAP_AS_properties != null) {
                  return ABAP_AS_properties;
              } else {
                  return null;
              }
      //        if(ABAP_AS_properties!=null) return ABAP_AS_properties;
      //        else throw new RuntimeException("Destination " + name + " is not available");
      
          }
      
          @Override
          public boolean supportsEvents() {
              return true;
          }
      
          @Override
          public void setDestinationDataEventListener(DestinationDataEventListener eventListener) {
              this.eventListener = eventListener;
          }
      
          public void changePropertiesForABAP_AS(Properties properties) throws ConexionSAPException {
      
              try {
      
                  if (!Environment.isDestinationDataProviderRegistered()) {
      
                      if (ABAP_AS_properties == null) {
                          ABAP_AS_properties = properties;
                      }
                      Environment.registerDestinationDataProvider(this);
      
                  }
      
                  if (properties == null) {
      
                      if (eventListener != null) {
                          eventListener.deleted(SAP_SERVER);
                      }
                      ABAP_AS_properties = null;
      
                  } else {
      
                      ABAP_AS_properties = properties;
                      if (eventListener != null) {
                          eventListener.updated(SAP_SERVER);
                      }
      
                  }
      
              } catch (Exception ex) {
      
                  throw new ConexionSAPException(ex.getMessage());
      
              }
      
      
          }
      }
      

      对不起,我真的不明白。包中有太多的依赖项,我不得不问,哪些类本质上是单个简单连接所需的函数?我已经浏览了这些课程,但我也不知道这些证书的用途。我想象它更容易。您的实现确实非常好,但我想构建自己的类,到现在为止,我真的不知道该怎么做:/我已经扩展了我的答案-这有帮助吗?是的,谢谢,它有帮助,但是如何替换连接和凭据类?它们是完全必要的还是我可以自己实现它们的基本功能?直到现在我才理解这两个的全部功能:/感谢您的耐心等待;)好的,我昨天已经解决了这个问题,所以我用想要的数据获取实现了我自己的DestinationDataProvider。但是现在我在你的第三点被抓住了如何传递字符串标识符。当我定义一个字符串时,设置我的Destinationproperties并想用该字符串调用目标时,属性是如何与该字符串链接的。这对我来说是最有问题的部分,因为我总是只看到示例,其中这个字符串只指向同名的destinationfile。