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修改过]