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