Skip to content

Commit

Permalink
fix #989 并同时支持通过Jdbcs注册自定义ValueAdaptor
Browse files Browse the repository at this point in the history
  • Loading branch information
wendal committed Dec 4, 2015
1 parent 8cd442e commit 1952740
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 1 deletion.
7 changes: 7 additions & 0 deletions src/org/nutz/dao/entity/annotation/ColDefine.java
Expand Up @@ -6,6 +6,8 @@
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.nutz.dao.jdbc.ValueAdaptor;

/**
* 给出字段的更加精确的数据库类型描述,方便 Dao 创建数据表
*
Expand Down Expand Up @@ -64,5 +66,10 @@
* 描述当前字段是否可更新
*/
boolean update() default true;

/**
* 自定义ValueAdaptor
*/

Class<? extends ValueAdaptor> adaptor() default ValueAdaptor.class;
}
5 changes: 4 additions & 1 deletion src/org/nutz/dao/impl/entity/AnnotationEntityMaker.java
Expand Up @@ -456,7 +456,10 @@ else if (Lang.contains(info.annPK.value(), info.name))
}

// 字段值的适配器
ef.setAdaptor(expert.getAdaptor(ef));
if (info.annDefine.adaptor().isInterface())
ef.setAdaptor(expert.getAdaptor(ef));
else
ef.setAdaptor(Mirror.me(info.annDefine.adaptor()).born());

// 输入输出
ef.setInjecting(info.injecting);
Expand Down
19 changes: 19 additions & 0 deletions src/org/nutz/dao/jdbc/Jdbcs.java
Expand Up @@ -23,6 +23,8 @@
import java.sql.Timestamp;
import java.sql.Types;
import java.util.Calendar;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import javax.sql.DataSource;

Expand Down Expand Up @@ -54,6 +56,8 @@ public abstract class Jdbcs {
private static final Log log = Logs.get();

private static final JdbcExpertConfigFile conf;

public static Map<String, ValueAdaptor> customValueAdaptorMap = new ConcurrentHashMap<String, ValueAdaptor>();

/*
* 根据配置文件获取 experts 的列表
Expand Down Expand Up @@ -168,8 +172,23 @@ public static ValueAdaptor getAdaptorBy(Object obj) {
return Adaptor.asNull;
return getAdaptor(Mirror.me(obj));
}

/**
* 注册一个自定义ValueAdaptor,若adaptor为null,则取消注册
* @param className 类名
* @param adaptor 值适配器实例,若为null,则取消注册
* @return 原有的值适配器
*/
public static ValueAdaptor register(String className, ValueAdaptor adaptor) {
if (adaptor == null)
return customValueAdaptorMap.remove(className);
return customValueAdaptorMap.put(className, adaptor);
}

public static ValueAdaptor getAdaptor(Mirror<?> mirror) {
ValueAdaptor custom = customValueAdaptorMap.get(mirror.getType().getName());
if (custom != null)
return custom;
// String and char
if (mirror.isStringLike())
return Jdbcs.Adaptor.asString;
Expand Down

3 comments on commit 1952740

@Rekoe
Copy link
Member

@Rekoe Rekoe commented on 1952740 Dec 4, 2015

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@wendal
这个功能怎么用

@Rekoe
Copy link
Member

@Rekoe Rekoe commented on 1952740 Dec 4, 2015

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@wendal
改了这个方式后创建表结构报错误
dao.create(TestPojo.class, false);

Exception in thread "main" java.lang.NullPointerException
    at org.nutz.dao.impl.entity.AnnotationEntityMaker._evalMappingField(AnnotationEntityMaker.java:459)
    at org.nutz.dao.impl.entity.AnnotationEntityMaker.make(AnnotationEntityMaker.java:250)
    at org.nutz.dao.impl.EntityHolder.getEntity(EntityHolder.java:69)
    at org.nutz.dao.impl.NutDao.create(NutDao.java:762)
    at org.nutz.IocProvider.main(IocProvider.java:38)

@wendal
Copy link
Member Author

@wendal wendal commented on 1952740 Dec 4, 2015

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

弄好了

Please sign in to comment.