在不依赖FacesContext的情况下为业务逻辑创建Java类

时间:2014-08-07 23:12:40

标签: xpages

好的,为标题道歉,但我不知道怎么说这个。 基本上我通过XPagesToolkit和XPageAgents遇到了sessionCloning,我假设它是使用这里描述的技术实现的http://www.wissel.net/blog/d6plinks/SHWL-99U64Q

我最初用它来运行由xpage触发的现有java代码,但可能需要一段时间才能运行。麻烦是我以这种或那种方式拥有的大多数现有代码依赖于FacesContext,以便访问公共bean以进行设置或仅用于基本日志记录。这会在通过XPagesAgent触发时导致错误,因为我认为没有facescontext。我真的不想最终复制代码并创建不同版本的业务逻辑。

所以我想我有两个问题..

1)要从java代码中引用bean,我可以使用这里描述的Factory方法,而不是直接通过variableResolver ... http://www.wissel.net/blog/d6plinks/SHWL-98U9EK但是我不知道如何手动创建bean对象,仍然可以获取可能已在faces config中设置的自定义属性。有没有办法以某种方式阅读这些?例如如果你手动创建一个dBar对象,你将如何从faces-config中获取logdb路径?

2)人们如何以一种无论在何种情况下始终有效的方式进行登录?我收集大多数人现在使用debugToolbar或XPagesOpenLogger,但这两者似乎都依赖于facescontext。我不想停止使用它们,但必须为了使我的java代码在xpage之外兼容。目前,大多数方法都有某种try / catch来调用dBar.error(e)。也许答案是创建一个连接dBarToolbar和原始prexpages openlogger java类的接口,然后通过工厂访问日志对象,该工厂将返回dbbar实例或openlogger,具体取决于是否存在faces上下文。或者人们在较低级别的方法中抛出错误,只是让更高级别的调用函数处理并记录它们?

谢谢!

解决方案 使用引导依赖注入我最终破坏了dBar以使其在两个方面都起作用。 我的商业bean仍然在顶部包含这个以便于记录

private final static DebugToolbar log = DebugToolbar.get();

但已经破解了一点,以使dBar也充当单身......

private static DebugToolbar instance;

// retrieve an instance of this toolbar class
public static DebugToolbar get() {
    if (null == instance) {
        return (DebugToolbar) resolveVariable(BEAN_NAME);
    } else {
        return instance;
    }
}

public static void setInstance(Session session, Database database) {
    instance = new DebugToolbar(session, database);
}
public static void clearInstance() {
    instance = null;
}

然后我可以像以前一样继续使用它来形成Xpage,但是当运行XPagesAgent时,我可以在开始时调用它来传递所需的引用,允许业务bean像以前一样使用相同的日志记录“工作”。

DebugToolbar.setInstance(session, database);

这是在XPagesAgent的末尾

DebugToolbar.clearInstance();

我不知道是否有必要,但如果单身人士比代理人持续时间更长,我认为他们会出错,我明白这样做

显然对dBar代码本身进行了一些调整,以跳过与FacesContext相关的任何内容(如果它不可用)。

这可能是一个可怕的反模式,但似乎有用...... :)

3 个答案:

答案 0 :(得分:4)

简答:declutter和依赖注入。

答案很长:
试着看看MVC模式。将通过EL直接与XPage交互的bean限制为外观模式。从那里调用您的业务bean并移交Java对象或Notes对象,如视图,文档或会话等。

当您想要将业务bean打包到(junit)测试工具中时,这是绝对必要的。所以而不是:

 BusinessBean.makeInvoices();
你会得到:

 BusinessBean.makeInvoices(session, NotesView, OutputStream);

可以从XPage,代理或独立的Java程序(想想JUnit,Jenkins)调用后面的函数。因此,不是在bean中找出依赖关系,而是在调用中提供它们。

这也称为关注点分离。你的豆子没有打扰周围的东西。

希望有所帮助

答案 1 :(得分:1)

正如斯图威尔先生所说,依赖注入是走向这里的方式。

但是对于日志记录,我更喜欢使用Log4j方式并避免将记录器传递给params。

按Log4j方式,我的意思是通过静态工厂方法(如Logger.getLogger('some.class'))获取对logger对象的引用,并将配置加载到log4j框架。

不幸的是,我不知道OpenLog记录器是否可以这样配置,它会自动从给定的配置文件(faces-config或其他)中读取设置。

您总是可以为log4j编写自定义appender,将日志路由到OpenLogger(这应该非常简单)

答案 2 :(得分:0)

从为OpenNTF Domino API开发日志记录的经验来看,最大的问题是Java安全异常。这包括定义不同的记录器和日志记录级别,以及动态加载不同的配置。您可以使用插件处理大部分内容,但我不确定您是否想要走得那么远。

Log4J是一种标准的Java日志记录机制,但它也会遇到安全选项。我认为log4j的自定义appender会遇到相同的安全异常,除非它在插件中。有人建议使用匿名记录器,但我还没试过。

OpenNTF Domino API在核心插件中有各种日志选项,而不是Xsp插件。 BaseOpenLogItem是IOpenLogItem的核心实现,不对facesContext有任何依赖。还有一个记录器可以记录到IBM_TECHNICAL_SUPPORT中的文件。 DominoUtils.handleException(Throwable)或(Throwable,String)将执行该日志记录。挑战在于确定触发异常的代码。