我有这段代码:
package org.DX_57.osgi.SH_27.impl;
import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.Properties;
import org.DX_57.osgi.SH_27.api.SessionHandle;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
import org.osgi.framework.Filter;
import org.osgi.framework.ServiceReference;
import org.osgi.util.tracker.ServiceTracker;
public class SessionHandleApp implements BundleActivator {
public static final String DSNAME = "jdbc/Oracle";
public ServiceTracker st;
@Override
public void start(final BundleContext bc) throws Exception {
debug("Activator started");
Filter filter = bc.createFilter("(&" + "(" + Constants.OBJECTCLASS
+ "=" + DataSource.class.getName() + ")" + "(jndi-name="
+ DSNAME + ")" + ")");
st = new ServiceTracker(bc, filter, null) {
@Override
public Object addingService(ServiceReference reference) {
DataSource ds = (DataSource) bc.getService(reference);
try {
debug(ds.getConnection().toString());
SessionHandle sh = new SessionHandleImpl();
sh.ds = ds;
bc.registerService(SessionHandle.class.getName(), sh, new Properties());
} catch (SQLException e) {
}
return super.addingService(reference);
}
@Override
public void removedService(ServiceReference reference,
Object service) {
super.removedService(reference, service);
}
};
st.open();
}
public void stop(BundleContext bc) throws Exception {
bc.ungetService(bc.getServiceReference(SessionHandle.class.getName()));
st.close();
}
private void debug(String msg) {
System.out.println("JDBCTestBundleActivator: " + msg);
}
}
当我尝试使用Netbeans编译代码时,这是我得到的错误:
http://i39.tinypic.com/14xdw5c.png
我如何解决这个问题?
这是完整的源代码: http://www.2shared.com/file/bziA4e-n/SH_27.html
祝福
答案 0 :(得分:4)
错误标记只是表示ds
类中没有可访问的成员SessionHandle
;除此之外,你没有给我们任何东西继续下去。也许它是私人的,也许它被称为不同的东西?您需要重新检查您存在这样一个字段的假设。与标记一起出现的错误消息可能会提供更多详细信息。
答案 1 :(得分:3)
您正在尝试访问字段ds
,但变量sh
的类型为SessionHandle
(接口),但没有此字段。实现SessionHandleImpl
可能包含此字段,但编译器只允许您访问接口中定义的方法和字段。
您可以通过添加:
来更新界面以指定此字段的setter方法public void setDataSource(DataSource ds);
然后在实现类中实现该setter - like :
public void setDataSource(DataSource ds)
{
this.ds = ds;
}
但是您需要查看SessionHandleImpl的内部才能正确执行此操作 - 我没有看过,甚至可能已经有了setter方法!
然后最后拨打sh.setDataSource(ds)
而不是sh.ds=ds
更新:或者您可以将sh
声明为SessionHandleImpl类型,因此其所有字段都将可见。然后你不能轻易地改变到另一个实现 - 但由于实现类在这里是硬编码的,所以这不是世界末日:
SessionHandleImpl sh = new SessionHandleImpl();