jdon的域模型事件注入问题

10-06-08 yxh1122
最近在项目中使用域模型事件来实现model的懒加载,刚开始在moel类Organization中按照jdon文档的步骤,创建域事件,创建事件监听类,在model中设置注入对象,可以实现事件的依赖注入,后来用同样的方法在另一个类Custom中创建,当运行到该类的属性获取方法getXingzhiText()时,发现需要注入的事件对象classifyValueDomainEvents 为null,出现错误。已经困扰两天了,希望banq能够给予帮助

以下是相关的代码:

model类 Custom :

package dnn.custom.model;

import com.jdon.annotation.model.Inject;

import com.jdon.async.message.EventMessage;

import com.jdon.controller.model.Model;

public class Custom extends Model {

@Inject

private ClassifyValueDomainEvents classifyValueDomainEvents = null;

private String xingzhiText;

public String getXingzhiText(){

EventMessage message = classifyValueDomainEvents.getClassifyValue(this);

message.getEventResult();

return this.xingzhiText;

}

public void setXingzhiText(String xingzhiText){

this.xingzhiText = xingzhiText;

}

...

}

域事件类ClassifyValueDomainEvents:

package dnn.custom.model;

import com.jdon.annotation.Introduce;

import com.jdon.annotation.model.Send;

import com.jdon.domain.message.DomainMessage;

@Introduce("message")

public class ClassifyValueDomainEvents {

@Send("getClassifyValue")

public DomainMessage getClassifyValue(Custom custom) {

return new DomainMessage(custom);

}

}

事件监听类 ClassifyValueMessageListener:

package dnn.custom.service;

import com.jdon.annotation.Component;

import com.jdon.domain.message.DomainMessage;

import com.jdon.domain.message.MessageListener;

import com.jdon.model.ModelKey;

import com.jdon.model.ModelManager;

import dnn.custom.model.Custom;

import dnn.organization.model.Organization;

@Component("getClassifyValue")

public class ClassifyValueMessageListener implements MessageListener {

private CustomService customService= null;

private ModelManager modelManager = null;

public ClassifyValueMessageListener(CustomService customService,ModelManager modelManager){

this.customService = customService;

this.modelManager = modelManager;

}

@Override

public void action(DomainMessage eventMessage) {

Custom custom = (Custom)eventMessage.getEventSource();

try {

} catch (Exception e) {

e.printStackTrace();

}

}

}

[该贴被yxh1122于2010-06-08 09:14修改过]

banq
2010-06-08 11:58
关键是 Custom 从数据库获得时,需要在仓储Repository的getCustom所在类上加@Introduce(“modelCache”) ,在getCustom方法上加@Around,如图:


yxh1122
2010-06-08 14:16
呵呵,找到原因了,是因为我没有添加域事件对象的get和set方法,很惭愧,多谢banq的帮助

oojdon
2010-06-09 09:40
2010年06月08日 14:16 "yxh1122"的内容
是因为我没有添加域事件对象的get和set方法 ...

确实容易忘记,我也遇到过,如果JF不通过set注入,直接注入就好了。

yxh1122
2010-06-18 18:09
现在又有了新的问题,域事件注入是在拦截器CacheInterceptor中,在访问服务的get方法时由拦截器拦截,得到model后执行model属性的域事件注入。但是我在一个model的域事件监听处理类中访问服务,利用域事件懒加载该model需要的其他model的属性,比如获取联系人model的所在客户名称,这个时候访问服务层的get属性方法获取的客户model将不能被CacheInterceptor拦截器拦截,因此得到的客户model内部定义的域事件将不能被注入,有没有解决办法,希望给予帮助,谢谢先

yxh1122
2010-06-20 16:29
从论坛查了下资料,动态AOP是耗费性能,因此Jdon框架使用了Web容器的缓存,这样能提高速度,所以要传入request参数。那么域事件的监听类没有方法获取request对象,不能使用WebAppUtil的getserivce方法获取service的代理对象,必须使用构造函数注入service对象,缓存拦截器是不能拦截此种方法获取的service的,也就不能为该service获取的model注入所需的对象了。这样岂不是很不方便。能否让监听类获取request,在里边通过WebAppUtil的getserivce方法获取service的代理对象呢?

banq
2010-06-20 17:11
2010年06月20日 16:29 "yxh1122"的内容
那么域事件的监听类没有方法获取request对象,不能使用WebAppUtil的getserivce方法获取service的代理对象 ...

这个功能应该在最新版本里提供了,WebAppUtil.getService("xxx")即可,无需request.

yxh1122
2010-06-20 17:30
呵呵,其实试了一下,用banq提供的以上的方法也可以解决,如果新版本提供该功能那就省的在存储层里在写东西了,可现在最新版的是6.22,还是没有这个功能,谢谢banq的帮助

[该贴被yxh1122于2010-06-20 18:06修改过]

猜你喜欢