nutzam / nutz Goto Github PK
View Code? Open in Web Editor NEWNutz -- Web Framework(Mvc/Ioc/Aop/Dao/Json) for ALL Java developer
Home Page: https://nutzam.com
License: Apache License 2.0
Nutz -- Web Framework(Mvc/Ioc/Aop/Dao/Json) for ALL Java developer
Home Page: https://nutzam.com
License: Apache License 2.0
nutz-1.b.39
jdk 1.6
glassfish v2.1
无
如果把nutz的jar包放在WEB-INF\lib目录中, 在glassfish v2.1环境启动, org.nutz.dao.jdbc.Jdbcs类初始化会失败.
54行报错, 应该是classloader的问题, 找不到org/nutz/dao/jdbc/nutz_jdbc_experts.js
把nutz-1.b.39-jdk6.jar还有log4jxxxx.jar两个文件, 放到glassfish的lib目录或者domains的lib目录
建议提供queryWith方法,可做对象关联查询。
最好能做到提供需要查询的属性,如
id
name
creator.id
creator.name
按此属性列表组查询语句进行查询,查询完毕后后填充对象。
无法处理:
String j = "{'abc':'http://wendal.net'}";
Map<String, Object> map = Json.fromJson(Map.class, j);
assertEquals("http://wendal.net", map.get("abc"));
实体类既有有@column注解的字段,也有无该注解的字段:
@table("PET")
public class Pet {
@id
private int id;
@column
private String name;
@column
private int age;
private boolean isHealthy;
...
在数据库管理工具中执行SELECT ID,NAME,AGE,TRUE AS ISHEALTHY FROM PET,会得到:
ID NAME AGE ISHEALTHY
1 tom 3 TRUE
2 didi 2 TRUE
3 mm 2 TRUE
然而通过Nutz.dao获取一个列表的回调,执行:
Dao dao = ...
Sql sql = Sqls.create("SELECT ID,NAME,AGE,TRUE AS ISHEALTHY FROM PET");
sql.setCallback(Sqls.callback.entities());
sql.setEntity(dao.getEntity(Pet.class));
dao.execute(sql);
List pets = sql.getList(Pet.class);
System.out.println(Json.toJson(pets));
却得到:
[{
"id" :1,
"name" :"tom",
"age" :3,
"isHealthy" :false
}, {
"id" :2,
"name" :"didi",
"age" :2,
"isHealthy" :false
}, {
"id" :3,
"name" :"mm",
"age" :2,
"isHealthy" :false
}]
也就是说非数据表字段isHealthy,没有被赋值
运行环境,mac os x,jetty 7
数据库环境,centos5,mysql5.5,实际表名为小写t_user
sql语句中表名为T_USER,报没有T_USER表的错误,而在windows平台下,可以正常查询
今天在写一对一/一对多的nutz demo,基本上完成了,不过遇到了一个问题,想咨询下目前是否支持这个需求。若不支持,以后会不会支持?
需求如下:
有两张表:DepartmentInfo和UserInfo
DepartmentInfo字段:departmentInfoId、departmentName
UserInfo字段:userInfoId、trueName、departmentInfoId
我想在查询UserInfo列表时,使用departmentInfo.departmentName来排序,请问怎样实现?
之前要实现此功能,我都是用视图解决,而不是用对象关联(如一对多)。
我想问以后打不打算支持这样的用法。因为Hibernate中可以这样用,感觉挺方便的。
List uiList = this.userInfoService.query(Cnd.orderBy().asc("departmentInfo.departmentName"), null);
在 POJO 对象上使用视图时,插入一条记录后,视图字段没有值,要再查询一次视图字段才能有值.
在1.b.39中,当调用下面的句子,而wherestr为null或空字符串时报错。
dao.query(table,Cnd.wrap(wherestr),pager);
不光query函数存在这种问题,其他的估计也存在。
原37版可以:
List roles = this.query(null, null);
this.dao().fetchLinks(roles, "sysModules");
现39版里报:
[INFO] 2011-08-17 00:38:21,578 org.nutz.lang.eject.EjectByField - Fail to get value by field
java.lang.IllegalArgumentException: Can not set java.lang.String field com.eyooo.edp.domain.SysRole.roleId to java.util.LinkedList
三个字儿建议用:
List roles = this.query(null, null);
for(SysRole role : roles)
this.dao().fetchLinks(role, "sysModules");
先解决。
nutz本身是没有问题的,而是我的应用场景,首先,我把用户信息的key放入了cookie里,那么在需要显示用户信息的地方我需要将cookie里的key拿到,然后从cache里取得用户信息放入request对象,在freemarker中显示,因为这样的需求比较多,使用filter过滤就搞定了!这里不需要跳转,很方便,当我遇到个别需要过滤权限的,比如没有登录用户则跳转,我便又写了一个过滤器,这个过滤器与CheckSession.class一样,只是从request里取得用户信息,如果没有则跳转,想想的流程太完美,其实fliter的优先级是再函数上的高,结果,request里没有user的信息~~~~~
没办法,我只能把上一个过滤器的部分方法再拿到这个过滤器里,重新在cookie里获取key,从cache里拿信息了!
请问各位老师,有什么比较优美的办法吗?
http://code.google.com/p/nutz/wiki/mvc_modules#@Modules_-_声明应用的所有子模块:
半自动搜索子模块
@modules(value={Abc.class, Xyz.class}, scanPackage = true)
public class MainModule {
...
这个用起来好别扭,我不想把类名写在这儿,能不能加个方式:直接指定要搜索子模块的包的相对路径(可以指定多个路径)
比如:
@modules(package={com.xxx.nutzzz.module, com.xxx.xxcrm.module}, scanPackage = true)
public class MainModule {
...
使用一个自己的类,继承了EntityService,使用EntityService的fetch方法时报的错误。
@IocBean(fields = {"dao"})
public class UserService extends AbstractService {
}
public abstract class AbstractService extends IdEntityService {
public void update(T t) {
dao().update(t);
}
public void insert(T t) {
dao().insert(t);
}
public void delete(T t) {
dao().delete(t);
}
}
主模块:
@modules(scanPackage=true)
@Localization("msg")
@encoding(input="UTF-8", output="UTF-8")
@IocBy(type = ComboIocProvider.class,
args = {"_org.nutz.ioc.loader.json.JsonLoader",
"ioc",
"_org.nutz.ioc.loader.annotation.AnnotationIocLoader",
"com.thstp.pmss.module",
"com.thstp.pmss.service"
})
public class MainModule {
}
错误日志输出:
org.nutz.lang.born.BorningException: Fail to born 'com.mysql.jdbc.log.Log' becasue:
Don't know how to born it!
at org.nutz.lang.Mirror.getBorningByArgTypes(Mirror.java:750)
at org.nutz.dao.impl.entity.NutEntity.(NutEntity.java:157)
at org.nutz.dao.impl.entity.AnnotationEntityMaker.make(AnnotationEntityMaker.java:77)
at org.nutz.dao.impl.EntityHolder.getEntity(EntityHolder.java:58)
at org.nutz.dao.impl.entity.field.AbstractLinkField.getLinkedEntity(AbstractLinkField.java:72)
at org.nutz.dao.impl.entity.field.ManyLinkField.(ManyLinkField.java:24)
at org.nutz.dao.impl.entity.AnnotationEntityMaker.make(AnnotationEntityMaker.java:198)
at org.nutz.dao.impl.EntityHolder.getEntity(EntityHolder.java:58)
at org.nutz.dao.impl.entity.field.AbstractLinkField.getLinkedEntity(AbstractLinkField.java:72)
at org.nutz.dao.impl.entity.field.ManyLinkField.(ManyLinkField.java:24)
at org.nutz.dao.impl.entity.AnnotationEntityMaker.make(AnnotationEntityMaker.java:198)
at org.nutz.dao.impl.EntityHolder.getEntity(EntityHolder.java:58)
at org.nutz.dao.impl.NutDao.fetch(NutDao.java:360)
at org.nutz.service.EntityService.fetch(EntityService.java:82)
at com.thstp.pmss.module.CheckLogModule.login(CheckLogModule.java:38)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.nutz.mvc.impl.processor.MethodInvokeProcessor.process(MethodInvokeProcessor.java:21)
at org.nutz.mvc.impl.processor.AbstractProcessor.doNext(AbstractProcessor.java:44)
at org.nutz.mvc.impl.processor.AdaptorProcessor.process(AdaptorProcessor.java:33)
at org.nutz.mvc.impl.processor.AbstractProcessor.doNext(AbstractProcessor.java:44)
at org.nutz.mvc.impl.processor.ActionFiltersProcessor.process(ActionFiltersProcessor.java:42)
at org.nutz.mvc.impl.processor.AbstractProcessor.doNext(AbstractProcessor.java:44)
at org.nutz.mvc.impl.processor.ModuleProcessor.process(ModuleProcessor.java:76)
at org.nutz.mvc.impl.processor.AbstractProcessor.doNext(AbstractProcessor.java:44)
at org.nutz.mvc.impl.processor.EncodingProcessor.process(EncodingProcessor.java:27)
at org.nutz.mvc.impl.processor.AbstractProcessor.doNext(AbstractProcessor.java:44)
at org.nutz.mvc.impl.processor.UpdateRequestAttributesProcessor.process(UpdateRequestAttributesProcessor.java:15)
at org.nutz.mvc.impl.NutActionChain.doChain(NutActionChain.java:36)
at org.nutz.mvc.impl.ActionInvoker.invoke(ActionInvoker.java:66)
at org.nutz.mvc.ActionHandler.handle(ActionHandler.java:30)
at org.nutz.mvc.NutFilter.doFilter(NutFilter.java:60)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98)
at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:326)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:227)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:170)
at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:822)
at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:719)
at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1013)
at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225)
at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.RuntimeException: Don't know how to born it!
at org.nutz.lang.born.BorningException.(BorningException.java:13)
... 60 more
在实现Setup接口里面,目前只能用
Ioc ioc = config.getIoc();
Dao dao = ioc.get(Dao.class, "dao");
这种方式获取对象,
感觉应该可以支持注入方式,比较方便:
@Inject
private Dao dao;
除具体的IocLoader实现,其他部分都是根据JsonLoader设计的
IocObject/IocField等对象都不是POJO, 序列化与反序列化都困难
之后几个版本,Nutz 的源码和 Issue 管理要彻底移动到 Github
在 Google Code 的 Issue 标签,设置一个中转页,中转到 Github 的 Issue 标签上
zDoc 需要支持 GitHub 的 Markdown 以便生成 wiki
如果 wiki 的效果不错,需要让 Google Code 的 wiki 标签也中转到 Github 上
Drizzle已经发布 7 GA, 开始步入稳定
在国际化设置语言的时候,需调用
Mvcs.setLocaleName(session, localeName);
Mvcs.setLocale(session, localeName);
才可以在页面直接切换;
感觉别扭?
失败代码
@table("IP")
public class IP {
@Id(auto = false)
private Long id;
@Column
private String a;
@Column
private String b;
@Column
private String c;
@Column
private Date date;
@Column
private String cityName;
@One(target = City.class, field = "cityName")
private City city;
}
@table("City")
public class City {
@Id(auto = false)
private Long id;
@Column
private String countryName;
@One(target = Country.class, field = "countryName")
private Country country;
@Many(target = IP.class, field = "cityName")
private Set<IP> ips;
}
@table("Country")
public class Country {
@Name
private String country;
@Many(target = City.class, field = "countryName")
private Set<City> citys;
}
失败代码,运行
Ioc ioc = new NutIoc(new JsonLoader("module.json"));
Dao dao = ioc.get(NutDao.class, "dao");
dao.create(IP.class, true);
dao.create(City.class, true);
dao.create(Country.class, true);
失败代码报错
run:
log4j:WARN No appenders could be found for logger (org.nutz.ioc.loader.json.JsonLoader).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Exception in thread "main" java.lang.RuntimeException: Fail to find hostField for @many(field=cityName) 'ips' : class enzo.ad.jo.statistics.City<=>class enzo.ad.jo.statistics.IP
at org.nutz.lang.Lang.makeThrow(Lang.java:84)
at org.nutz.dao.impl.entity.field.ManyLinkField.(ManyLinkField.java:46)
at org.nutz.dao.impl.entity.AnnotationEntityMaker.make(AnnotationEntityMaker.java:198)
at org.nutz.dao.impl.EntityHolder.getEntity(EntityHolder.java:58)
at org.nutz.dao.impl.entity.field.AbstractLinkField.getLinkedEntity(AbstractLinkField.java:72)
at org.nutz.dao.impl.entity.field.OneLinkField.(OneLinkField.java:27)
at org.nutz.dao.impl.entity.AnnotationEntityMaker.make(AnnotationEntityMaker.java:194)
at org.nutz.dao.impl.EntityHolder.getEntity(EntityHolder.java:58)
at org.nutz.dao.impl.NutDao.create(NutDao.java:545)
at enzo.test.NewClass.main(NewClass.java:26)
Java Result: 1
成功生成(总时间:4 秒)
成功运行的代码,带有继承的
public class AD {
@Id(auto = false)
private Long id;
@Column
private Date buildDate;
@Column
private int duration;
@Column
private String title;
@Column
private String context;
@Column
private int visita;
@Column
private String userEmail;
@One(target = User.class, field = "userEmail")
private User user;
}
@table("Bed")
public class Bed extends AD {
@Column
private Double money;
@Column
private Date fromDate;
@Column
private String roomType;
@Column
private int numBed;
@Column
private String sex;
}
@table("Room")
public class Room extends AD{
@Column
private Double money;
@Column
private Date fromDate;
@Column
private String roomType;
}
@table("User")
public class User {
@Name
private String email;
@Column
private String password;
@Column
private String nome;
@Column
private String phone;
@Many(target = Bed.class, field = "userEmail")
private List<Bed> beds;
@Many(target = Room.class, field = "userEmail")
private List<Room> rooms;
}
成功运行代码
Ioc ioc = new NutIoc(new JsonLoader("module.json"));
Dao dao = ioc.get(NutDao.class, "dao");
dao.create(Bed.class, true);
dao.create(Room.class, true);
dao.create(User.class, true);
没有报错,成功运行,而且存取都没有问题
预计发布的期为 8.1 日
因为 1.b.38 发布之后,可能会迅速被报几个严重的问题,比如 Issue #11
我们摘重要的修复,然后快速发布一版 bug fix 版
在 “不构建 POJO 访问数据库” http://code.google.com/p/nutz/wiki/dao_record 中
针对表查询都是查全部字段的,对于动态字段来说有时候不必要查全部字段,
希望可以扩展下支持查询自定义字段,并且返回查询结果。
我觉得有必要在IOC手册上加一章交IOC注解列表,因为像DAO,MVC都有注解列表,我们看文档时可以随时查到该注解是什么用途,但唯独IOC没有这个,有时看的就很迷茫,不知道有些注解是什么意义,建议加上,个人意见哈
我的场景是这样的,我正在使用Mongodb
public class Test2{
private ObjectId id;
private String name;
}
其中ObjectId 是Mongodb自带的一种类型,Json.toJson后的结果
{
"id" :{
"_new" :false
},
"name" :"wakk"
}
这并不是我所希望的结果,我希望可以将这个字段toString就ok了~~
有什么好办法吗?
JDK 7即将发布, 测试一下还是很有必要的
本来想在@fail的视图中进行一些处理的,但是session中保存的用户信息都被清空了,断点了一下,怀疑是ModuleProcessor中的reqContext.depose()闹的,不明白这样处理的目的是什么。不能在错误页中获取session属性实在是一件很麻烦的事的说
一对多关联,调用insertWith方法关联新增后,发现关联属性字段为空。
关联新增代码:
dao.drop(Pet.class);
dao.drop(Master.class);
dao.create(Pet.class, true);
dao.create(Master.class, true);
Master master = new Master();
master.setName("Test");
List<Pet> pets = new ArrayList<Pet>();
Pet pet = new Pet();
pet.setName("Lee");
pet.setAge(32);
pets.add(pet);
pet.setMaster(master);
pet = new Pet();
pet.setName("Lees");
pet.setAge(33);
pets.add(pet);
pet.setMaster(master);
master.setPets(pets);
dao.insertWith(master, "pets");
日志:
2011-07-31 19:35:22 DEBUG [main] INSERT INTO t_master(name) VALUES(?)
| 1 |
|------|
| Test |
For example:> "INSERT INTO t_master(name) VALUES('Test') "
2011-07-31 19:35:22 DEBUG [main] SELECT MAX(id) AS id FROM t_master
2011-07-31 19:35:22 DEBUG [main] INSERT INTO t_pet(name,age,masterId) VALUES(?,?,?)
| 1 | 2 | 3 |
|-----|----|------|
| Lee | 32 | NULL |
For example:> "INSERT INTO t_pet(name,age,masterId) VALUES('Lee',32,NULL) "
2011-07-31 19:35:22 DEBUG [main] SELECT MAX(id) AS id FROM t_pet
2011-07-31 19:35:22 DEBUG [main] INSERT INTO t_pet(name,age,masterId) VALUES(?,?,?)
| 1 | 2 | 3 |
|------|----|------|
| Lees | 33 | NULL |
For example:> "INSERT INTO t_pet(name,age,masterId) VALUES('Lees',33,NULL) "
2011-07-31 19:35:22 DEBUG [main] SELECT MAX(id) AS id FROM t_pet
Mirror<?> mirror = Mirror.me(Cache.class);
System.out.println(mirror.getStaticMethods().length); -- 结果为0
System.out.println(mirror.getFields().length); -- 结果也为0
Cache类如下:
public class Cache {
public static Map<String, Config> config;
public static List<User> userList;
.........
类中只有静态变量,没有任何方法,包括get/set
}
测试AllApp类的时候需要加jetty包,其中包括:
jetty-annotations-7.3.1 jar
jetty-continuation-7.3.1 jar
jetty-http-7.3.1 jar
jetty-io--7.3.1 jar
jetty-security-7.3.1 jar
jetty-server-7.3.1 jar
jetty-servlet-7.3.1 jar
jetty-util-7.3.1 jar
jetty-webapp-7.3.1 jar
jetty-websocket-7.3.1 jar
jetty-xml-7.3.1 jar
否则运行testapp下面类时候会出错.
目前这个项目还是_For_1.b.35.zip
换用38 jar后,不少地方报错,因为38改了接口,希望更新下……
问题产生的条件:
nutzmole-1.2生成的代码
发生问题的调用代码:
模块的添加调用
问题的详细说明:
添加时不能自动封装对象。@param("::tag.") Tag obj。obj=null
异常堆栈:
没有报异常
nutz非常棒,开发团队辛苦了,向你们致敬!
提个建议:希望后续版本中UploadAdaptor能支持html5上传,谢谢!
sql语句如下;
StringBuffer sb = new StringBuffer("");
sb.append("if (select count(*) from CorpLogin where CorpID = " + corpWeb.getCorpID() + ") = 0 ");
sb.append(" insert into CorpLogin(corpID,WebLoginDate,WebLoginTimes) values (" + corpWeb.getCorpID() + ",getDate(),1)");
sb.append("else");
sb.append(" update CorpLogin set WebLoginDate =getDate(),WebLoginTimes=WebLoginTimes+1 where corpId =" + corpWeb.getCorpID() + "");
Sql sql = Sqls.create(sb.toString());
dao.execute(sql);
异常:
org.nutz.mvc.impl.processor.FailProcessor - Catch handle error
org.nutz.dao.DaoException: java.lang.RuntimeException: r u kidding me?! It is impossible!
at org.nutz.dao.impl.sql.run.NutDaoRunner.run(NutDaoRunner.java:74)
at org.nutz.dao.impl.DaoSupport._exec(DaoSupport.java:178)
at org.nutz.dao.impl.DaoSupport.execute(DaoSupport.java:169)
目前发现数据源为db2的时候Nutz无法正确构建insert语句。(或许和驱动版本还有关系)
跟踪源码发现是因为Entity所有的字段都被设置成了readOnly而导致构建SQL失败。根本原因是DB2驱动rsmd.isReadOnly(x)的时候,永远返回true。
建议为DB2JdbcExpert类添加setupEntityField方法覆盖AbstractJdbcExpert的对应方法,并跳过通过驱动检查字段是否只读(DB2上貌似没有这种只读字段的概念?Google上也查不到。。。)
以AbstractJdbcExpert中的方法为例子:修改第70行和71行:
if (!mf.isReadonly() && rsmd.isReadOnly(ci))
mf.setAsReadonly();
这2行在DB2JdbcExpert覆盖的方法中删除。
ps. Nutz的版本是1.b.38
所有数据库单元测试通过
小白测试通过
Release Note 准备完毕
我的代码是Cnd.where("systemName", "=", systemName).desc("menu1order")
BEAN里的代码为
@column("MENU_1_ORDER")
private Boolean menu1order;
生成的SQL是
SELECT * FROM SYS_SYSTEM WHERE SYSTEM_NAME=? ORDER BY menu1order DESC
期待的SQL是
SELECT * FROM SYS_SYSTEM WHERE SYSTEM_NAME=? ORDER BY menu_1_order DESC
目前38已经支持了多级对象的收集,但是不支持字段为List的收集,如下面的例子:
public class Book {
private Attachment cover;
private List covers = AutoArrayList();
}
public class Attachment {
private String name;
}
再看action:
@at
public void save(@param("::book.") Book book) {
bookManager.save(book);
}
最后看jsp:
<input name="book.cover.name" type="text" value="${obj.cover.name}">
<input name="book.covers[0].name" type="text" value="name1">
<input name="book.covers[1].name" type="text" value="name2">
<input name="subject_submit" value="确定更新" type="submit">
上述例子中,book对象中的cover是可以收集的,但是身为List的covers对象则无法收集,看了下ObjectNavlPairInjector.java,并没有针对List做特殊处理。
这个功能在Struts中用得比较多,而且某些时候是相当的好用,强烈希望Nutz支持这种方式^_^
问题条件:nutz为最新版1.39
问题描述:
前台传递json数据流:{“articles”:[{"id":"1"},{"id":"2"}]}
后台适配
@AdaptBy(type=JsonAdaptor.class)
public void addArticle(@param("articles")Article[] as){
}这种方式匹配正确
@AdaptBy(type=JsonAdaptor.class)
public void addArticle(@param("articles") List
错误堆栈:java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to domain.Article
Object--> Map 感觉不错
现在解析端是 String --> Map --> Pojo
序列化端其实也是Pojo --> Map--> String
方便Mongodb使用,呵呵
另外,config.getAtMap().size() 也是0
1.b.39
public class NewClass {
public static void main(String[] aaa) {
Ioc ioc = new NutIoc(new JsonLoader("module.json"));
Dao dao = ioc.get(NutDao.class, "dao");
// dao.create(Country.class, true);
String a = "aaaaaaaa";
String b = "sssssssss";
Country paese = dao.fetch(Country.class, a);
if (paese == null) {
paese = new Country();
paese.setCitys(new HashSet());
paese.setCountry(a);
paese.getCitys().add(b);
dao.insert(paese);
} else {
paese.getCitys().add(b);
dao.update(paese);
}
}
}
@table("Country")
public class Country {
@Name
private String country;
@Column
private Set<String> citySet;
public Country() {
}
public Set<String> getCitys() {
return citySet;
}
public void setCitys(Set<String> citys) {
this.citySet = citys;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Country other = (Country) obj;
if ((this.country == null) ? (other.country != null) : !this.country.equals(other.country)) {
return false;
}
if (this.citySet != other.citySet && (this.citySet == null || !this.citySet.equals(other.citySet))) {
return false;
}
return true;
}
@Override
public int hashCode() {
int hash = 5;
hash = 59 * hash + (this.country != null ? this.country.hashCode() : 0);
hash = 59 * hash + (this.citySet != null ? this.citySet.hashCode() : 0);
return hash;
}
@Override
public String toString() {
return "Country{" + "country=" + country + ", citys=" + citySet + '}';
}
}
run:
log4j:WARN No appenders could be found for logger (org.nutz.ioc.loader.json.JsonLoader).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Exception in thread "main" org.nutz.dao.DaoException: java.lang.RuntimeException: Fail to set '[sssssssss]'[ null ] to field enzo.ad.jo.statistics.Country.'citySet' because [org.nutz.json.JsonException: !Json syntax error nearby [row:0,col:1 char 's'], reason: 'Unexpected char']: !Json syntax error nearby [row:0,col:1 char 's'], reason: 'Unexpected char'
at org.nutz.dao.impl.sql.run.NutDaoRunner.run(NutDaoRunner.java:74)
at org.nutz.dao.impl.DaoSupport._exec(DaoSupport.java:178)
at org.nutz.dao.impl.NutDao.fetch(NutDao.java:364)
at enzo.test.NewClass.main(NewClass.java:24)
Caused by: java.lang.RuntimeException: Fail to set '[sssssssss]'[ null ] to field enzo.ad.jo.statistics.Country.'citySet' because [org.nutz.json.JsonException: !Json syntax error nearby [row:0,col:1 char 's'], reason: 'Unexpected char']: !Json syntax error nearby [row:0,col:1 char 's'], reason: 'Unexpected char'
at org.nutz.lang.Lang.makeThrow(Lang.java:84)
at org.nutz.lang.inject.InjectByField.inject(InjectByField.java:30)
at org.nutz.dao.impl.entity.field.AbstractEntityField.setValue(AbstractEntityField.java:53)
at org.nutz.dao.impl.entity.field.NutMappingField.injectValue(NutMappingField.java:59)
at org.nutz.dao.impl.entity.NutEntity.getObject(NutEntity.java:176)
at org.nutz.dao.impl.sql.pojo.PojoFetchEntityCallback.invoke(PojoFetchEntityCallback.java:14)
at org.nutz.dao.impl.jdbc.NutPojo.onAfter(NutPojo.java:108)
at org.nutz.dao.impl.sql.run.NutDaoExecutor.exec(NutDaoExecutor.java:102)
at org.nutz.dao.impl.DaoSupport$2.invoke(DaoSupport.java:181)
at org.nutz.dao.impl.sql.run.NutDaoRunner.run(NutDaoRunner.java:63)
... 3 more
Java Result: 1
成功生成(总时间:3 秒)
当model类中的属性用@readonly注解时,在更新的时候,会连同这些字段一起更新。
用Debug进行跟踪,发现org.nutz.dao.impl.sql.pojo.UpdateFieldsPItem类中的joinSql()方法在进行参数组合的时候没有过滤这些字段。如下:
public void joinSql(Entity<?> en, StringBuilder sb) {
List<MappingField> mfs = _mfs(en);
sb.append(" SET ");
for (MappingField mf : mfs)
sb.append(mf.getColumnName()).append("=?,");
sb.setCharAt(sb.length() - 1, ' ');
}
而参看1.b.37中的org.nutz.dao.sql.SqlMarker类的update()方法,在进行参数组合时就使用了以下代码进行过滤。
if (ef == en.getIdentifiedField() || ef.isPk() || ef.isReadonly())
continue;
在国际化配置文件里,如果注释前面有 空格 则会报个空异常?
#---注释 在#号前面有空格报下面的错误
java.lang.NullPointerException
at java.io.StringReader.(StringReader.java:33)
at org.nutz.lang.segment.CharSegment.valueOf(CharSegment.java:212)
at org.nutz.mvc.impl.NutMessageLoader.load(NutMessageLoader.java:80)
at org.nutz.mvc.impl.NutLoading.evalLocalization(NutLoading.java:240)
at org.nutz.mvc.impl.NutLoading.load(NutLoading.java:92)
at org.nutz.mvc.ActionHandler.(ActionHandler.java:19)
at org.nutz.mvc.NutFilter.init(NutFilter.java:41)
应该可以避免吧?
环境:JDK1.5+nutz-1.b.39-jdk5.jar
触发:启动中报错
描述:
2011-08-18 07:08:00,754 [main] ERROR org.nutz.log.Logs - Error happend during st
art serivce!
java.lang.RuntimeException: java.lang.NoClassDefFoundError: java/util/Deque
at org.nutz.lang.Lang.wrapThrow(Lang.java:133)
at org.nutz.mvc.impl.NutActionChainMaker.eval(NutActionChainMaker.java:4
8)
at org.nutz.mvc.impl.UrlMappingImpl.add(UrlMappingImpl.java:33)
at org.nutz.mvc.impl.NutLoading.evalUrlMapping(NutLoading.java:165)
at org.nutz.mvc.impl.NutLoading.load(NutLoading.java:87)
at org.nutz.mvc.ActionHandler.(ActionHandler.java:19)
at org.nutz.mvc.NutFilter.init(NutFilter.java:41)
at org.apache.catalina.core.ApplicationFilterConfig.getFilter(Applicatio
nFilterConfig.java:275)
at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(Applica
tionFilterConfig.java:397)
at org.apache.catalina.core.ApplicationFilterConfig.(ApplicationFi
lterConfig.java:108)
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.
java:3696)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4
343)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443
)
at org.apache.catalina.core.StandardService.start(StandardService.java:5
16)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:710
)
at org.apache.catalina.startup.Catalina.start(Catalina.java:566)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
Caused by: java.lang.NoClassDefFoundError: java/util/Deque
at org.nutz.el.El.(El.java:17)
at org.nutz.mvc.view.AbstractPathView.(AbstractPathView.java:38)
at org.nutz.mvc.view.ServerRedirectView.(ServerRedirectView.java:2
1)
at org.nutz.mvc.view.DefaultViewMaker.make(DefaultViewMaker.java:39)
at org.nutz.mvc.impl.processor.ViewProcessor.evalView(ViewProcessor.java
:71)
at org.nutz.mvc.impl.processor.ViewProcessor.init(ViewProcessor.java:23)
at org.nutz.mvc.impl.NutActionChainMaker.eval(NutActionChainMaker.java:3
... 23 more
来自 Google code Issues: http://code.google.com/p/nutz/issues/detail?id=512
by crab041
RT
获取当前会话的 Locale 名称 不支持EL表达式,
LOCALE_NAME = "nutz.mvc.locale";
使用 ${nutz.mvc.locale} 是不支持的,
希望可以改个名字,支持 EL的
看下面代码:
List list = dao().query(LanguageDetail.class,Cnd.where("cid", "LIKE", "%"+cid+"%").and("code", "Like", "%"+code+"%").orderBy().asc("cid"), pager);
查询时,不会执行where条件 只会执行 order by asc
去掉: orderBy() 是Ok的
当1.b.39运行如下单元测试代码报错:
@test
public void dd(){
String filters=null;
Map map=(Map) Json.fromJson(filters);
}
而1.b.34到1.b.37不会。
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.