【问题标题】:How to Fix this java code? [closed]如何修复这个java代码? [关闭]
【发布时间】:2012-02-03 17:03:53
【问题描述】:

我有这个代码:

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

最好的祝福

【问题讨论】:

  • 请在此处显示完整的错误消息文本,而不是在链接中。通过注释指出哪一行代码抛出了错误。
  • 如果我发布一个没有那个小红线的屏幕截图会有帮助吗?
  • 顺便说一句,否决票不是我的。
  • 如果可以显示SessionHandle类,就很容易找到确切的错误。

标签: java jakarta-ee netbeans maven


【解决方案1】:

错误标记只是表示ds 类中没有可访问的成员SessionHandle;除此之外,你没有给我们任何继续下去的机会。也许它是私人的,也许它被称为不同的东西?您需要重新检查您认为存在这样一个字段的假设。标记附带的错误消息可能会提供更多详细信息。

【讨论】:

【解决方案2】:

您正在尝试访问字段ds,但变量sh 的类型为SessionHandle(一个接口),它没有该字段。实现SessionHandleImpl 可能有这个字段,但是编译器只会让你访问接口中定义的方法和字段。

您可以通过添加以下内容来更新接口以指定该字段的 setter 方法:

public void setDataSource(DataSource ds);

然后在实现类中实现该设置器 - 类似

    public void setDataSource(DataSource ds)
    {
        this.ds = ds;
    }

但您需要查看 SessionHandleImpl 的内部结构才能正确执行此操作 - 我还没有查看,它甚至可能已经有了 setter 方法!

然后最后调用sh.setDataSource(ds)而不是sh.ds=ds

更新:或者,您可以将 sh 声明为 SessionHandleImpl 类型,因此其所有字段都将可见。然后,您不能轻易更改为另一个实现 - 但由于实现类在这里是硬编码的,这不是世界末日:

SessionHandleImpl sh = new SessionHandleImpl();

【讨论】:

  • 请原谅我缺乏知识。我还在学习Java。你能告诉我正确的代码吗?
  • 非常感谢!它有效!
猜你喜欢
  • 2017-12-01
  • 2021-02-28
  • 1970-01-01
  • 2015-10-02
  • 1970-01-01
  • 2017-05-12
  • 2011-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多