Giter Site home page Giter Site logo

nutzam / nutz Goto Github PK

View Code? Open in Web Editor NEW
2.5K 269.0 943.0 43.38 MB

Nutz -- Web Framework(Mvc/Ioc/Aop/Dao/Json) for ALL Java developer

Home Page: https://nutzam.com

License: Apache License 2.0

Shell 0.01% Java 99.45% JavaScript 0.16% Assembly 0.01% Batchfile 0.01% Python 0.02% Ruby 0.36% Procfile 0.01%
nutz java orm javaee aop ioc micro-framework

nutz's Introduction

Nutz 官网的源代码

官网的迭代

目前官网已经迭代了2个版本

  • 1.0版本,由nutz创始人zozoh编写
  • 2.0版本,由nutz提交者胖五编写并维护

2.0版本主要解决了网页不能自适应的问题,并且从新梳理了网站结构。

目前nutz官方社区已经上线,两个网站有一些交叉内容,但又没有统一维护,所以接下来的改进计划主要是围绕2个网站的融合进行的。2.x版本将在不断完善官网功能并统一整合好社区内容后,升级为3.0版本。

也就说以后nutz官网也要开始发版本了。

2.x开发计划

目前开发思路有两个

  1. 整合社区网站内容
  2. 提高nutz官网逼格

1就不用说了,就是整合2个网站内容

2除了让官网更好用,样子更好看以外,主要是提供一些nutz相关项目的展示与阐述nutz一些开发理念,更多是推广方面内容,方便大家去安利nutz

目前开发计划如下:

  • 新版网页(BS重写)上线(2017.01上线)
  • 文档页根据社区反馈重构(2017.05上线)
  • demo展示,子项目展示页 (预计2017.06上线)
  • 官网新闻页 (预计2017.06上线)
  • nutz项目参与人 (预计2017.07上线)
  • nutz网站(官网,社区)新版设计稿 (预计2017.07完成)
  • nutz网站基础样式指南与控件 (预计2017.08完成)
  • nutz网站3.0上线 (预计2017.10上线)

更多的内容可能在开发过程中加入进来,也欢迎各位喜欢nutz朋友提出好的建议给我们, 来提几个issue

最后来点鼓励吧

该项目无盈利,完全是个人利用空闲时间进行开发,所以如果nutz网站的改进对你有了帮助,欢迎 “打赏” 以资鼓励。

请me喝杯咖啡吧!

向胖五支付吧_w500

nutz's People

Contributors

amosleaf avatar denghuafeng avatar dependabot[bot] avatar eggsblue avatar georgekankava avatar happyday517 avatar howe avatar hzl7652 avatar insidezhou avatar juqkai avatar kerbores avatar landraxee avatar lifecube avatar lihongjie0209 avatar mccxj avatar ming300 avatar mingzfan avatar pangwu86 avatar qinerg avatar rekoe avatar satellite168 avatar threefish avatar tomyule avatar wendal avatar wizzercn avatar xiaofengfu avatar xing-kenny avatar ywjno avatar zccm avatar zozoh avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

nutz's Issues

Json.toJson 可不可以对某些字段特殊处理

我的场景是这样的,我正在使用Mongodb

public class Test2{

private ObjectId id;

private String name;

}

其中ObjectId 是Mongodb自带的一种类型,Json.toJson后的结果
{
"id" :{
"_new" :false
},
"name" :"wakk"
}

这并不是我所希望的结果,我希望可以将这个字段toString就ok了~~
有什么好办法吗?

一对多关联,调用insertWith方法关联新增后,发现关联属性字段为空

一对多关联,调用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

DAO 无法fetch对象中的set,list

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 秒)

国际化的一个小BUG

在国际化设置语言的时候,需调用
Mvcs.setLocaleName(session, localeName);
Mvcs.setLocale(session, localeName);
才可以在页面直接切换;

感觉别扭?

建议提供queryWith方法,可做对象关联查询

建议提供queryWith方法,可做对象关联查询。
最好能做到提供需要查询的属性,如

id
name
creator.id
creator.name

按此属性列表组查询语句进行查询,查询完毕后后填充对象。

探讨“插入前后的设置”

目前的 @Prev 和 @Next 只能“接受一组 @Sql 作为参数”,这并不能满足我们在持久化实体的时,对某些字段的特殊设置——比如MD5加密用户密码字段。

想到两个方案:
1.nutz的实体解析,加个功能,字段注解:MD5
比如:
@Coldefine(MD5=true)
private String password;

2.增强@Prev 和 @Next,使其可以接受一个Java静态方法——这个是用户写的
比如:
@Prev(@java(MD5Helper.toMd5))
private String password;

DAO多对多查询出错

原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关联查询的排序问题

今天在写一对一/一对多的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);

dao生成SQL有问题

我的代码是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

使用EntryService报Entry错误:xxxx.Log无法生成

使用一个自己的类,继承了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

Nutz.dao获取实体的回调,实体类中的非数据表字段未被赋值

实体类既有有@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,没有被赋值

DB2环境上NutzDao的fastInsert失败

目前发现数据源为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

[1.b.38]Model类中@Readonly注解失效

当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;

表单收集不支持List字段

目前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支持这种方式^_^

1.38执行sql语句有问题.

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)

表达式引擎的使用报错

环境: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
  1.  ... 23 more
    

nutz-1.b.39在glassfish v2.1环境出现类初始化失败

问题产生的条件:

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目录

查询条件加上 orderBy()后 Where条件被忽略?

看下面代码:
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的

建议在IOC手册文档里新增注解列表

我觉得有必要在IOC手册上加一章交IOC注解列表,因为像DAO,MVC都有注解列表,我们看文档时可以随时查到该注解是什么用途,但唯独IOC没有这个,有时看的就很迷茫,不知道有些注解是什么意义,建议加上,个人意见哈

整理IocLoader的代码

除具体的IocLoader实现,其他部分都是根据JsonLoader设计的

IocObject/IocField等对象都不是POJO, 序列化与反序列化都困难

mvc JsonAdaptor遇对象集合适配有问题

问题条件: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

as){
}这种方式匹配报错

错误堆栈:java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to domain.Article

Mirror类无法获取对象中的静态变量

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

}

Json.fromJson(null)报错

当1.b.39运行如下单元测试代码报错:
@test
public void dd(){
String filters=null;
Map map=(Map) Json.fromJson(filters);
}

而1.b.34到1.b.37不会。

url匹配的问题

@at("/userList/?/size/?")
public QueryResult userList(int pageNumber, int pageSize)

@at("/userList/?")
public QueryResult userList(int pageNumber)

@at("/userList")
public QueryResult userList()

第一个url请求匹配不正确,报404

在Module中抛出异常后,session中的属性就被清空了

本来想在@fail的视图中进行一些处理的,但是session中保存的用户信息都被清空了,断点了一下,怀疑是ModuleProcessor中的reqContext.depose()闹的,不明白这样处理的目的是什么。不能在错误页中获取session属性实在是一件很麻烦的事的说

国际化配置文件注释前面有空格会报空异常?

在国际化配置文件里,如果注释前面有 空格 则会报个空异常?
#---注释 在#号前面有空格报下面的错误
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)

应该可以避免吧?

DAO,A类中一对一B,B中一对多A,无法创建表,但是有继承的情况下可以,什么问题

失败代码

@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);

没有报错,成功运行,而且存取都没有问题

发布 Nutz1.b.39

预计发布的期为 8.1 日
因为 1.b.38 发布之后,可能会迅速被报几个严重的问题,比如 Issue #11
我们摘重要的修复,然后快速发布一版 bug fix 版

Mvc:使用UploadAdaptor时,ArrayInjector和NameInjector注入的参数值错误

当使用UploadAdaptor作为适配器时,如果入口参数中声明了:

@param("name") String[]或@param("title") String

时,在入口函数中获取到的参数值错误,实际结果是将Uploading.parse返回的NutMap强行castor的结果。

是由于ArrayInjector和NameInjector中都有这样一段代码造成的:

if (null != refer)
return Castors.me().castTo(refer, type);

一个关于Filter 的问题

nutz本身是没有问题的,而是我的应用场景,首先,我把用户信息的key放入了cookie里,那么在需要显示用户信息的地方我需要将cookie里的key拿到,然后从cache里取得用户信息放入request对象,在freemarker中显示,因为这样的需求比较多,使用filter过滤就搞定了!这里不需要跳转,很方便,当我遇到个别需要过滤权限的,比如没有登录用户则跳转,我便又写了一个过滤器,这个过滤器与CheckSession.class一样,只是从request里取得用户信息,如果没有则跳转,想想的流程太完美,其实fliter的优先级是再函数上的高,结果,request里没有user的信息~~~~~

没办法,我只能把上一个过滤器的部分方法再拿到这个过滤器里,重新在cookie里获取key,从cache里拿信息了!
请问各位老师,有什么比较优美的办法吗?

让 Google Code 仅仅负责下载

之后几个版本,Nutz 的源码和 Issue 管理要彻底移动到 Github
在 Google Code 的 Issue 标签,设置一个中转页,中转到 Github 的 Issue 标签上
zDoc 需要支持 GitHub 的 Markdown 以便生成 wiki
如果 wiki 的效果不错,需要让 Google Code 的 wiki 标签也中转到 Github 上

UploadAdaptor不支持html5上传

nutz非常棒,开发团队辛苦了,向你们致敬!
提个建议:希望后续版本中UploadAdaptor能支持html5上传,谢谢!

nutz test webapp 测试出错

测试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下面类时候会出错.

主模块声明应用的子模块时,能够直接指定包的相对路径,来搜索子模块

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 {
...

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.