Giter Club home page Giter Club logo

resty's Introduction

Resty 一款极简的restful轻量级的web框架

更新说明


  • feature/20170203 强化Stringer工具和让日志支持彩色输出方便开发者调试 @t-baby

Join the chat at https://gitter.im/Dreampie/Resty Issue Stats Issue Stats 开发文档

如果你还不是很了解restful,或者认为restful只是一种规范不具有实际意义,推荐一篇osc两年前的文章:RESTful API 设计最佳实践 和 Infoq的一篇极其理论的文章 理解本真的REST架构风格 虽然有点老,介绍的也很简单,大家权当了解,restful的更多好处,还请google

拥有jfinal/activejdbc一样的activerecord的简洁设计,使用更简单的restful框架

restful的api设计,是作为restful的服务端最佳选择(使用场景:客户端和服务端解藕,用于对静态的html客户端(mvvm等),ios,andriod等提供服务端的api接口)

Java开发指南:Java style guide

Api设计指南:Http api design

Resty例子: resty-samples(纯接口) resty-demo(带界面)

如果你在考虑前后端分离方案,推荐resty+vuejs,https://github.com/Dreampie/vuejs2-demo

开发群: 极简Restful框架 - Resty

其他开发者贡献的插件:Beetl扩展(大鹏) Shiro扩展(zhoulieqing) MongoPlugin(T-baby)

有兴趣一起维护该框架的,可以联系我,进入合作开发

规范:提前说明功能,新建分支 feature/日期 功能 fix/日期 修复 在readme里添加一个TODO list描述

  • feature/20161228 a task list item done @Dreampie
  • feature/20161229 a task list item todo @Dreampie

注意代码2格缩进,最后所有合作者一起代码review,合格之后合并到master

maven使用方式:

  1. 添加依赖包
<dependency>
    <groupId>cn.dreampie</groupId>
    <artifactId>resty-route</artifactId>
    <version>1.3.1.SNAPSHOT</version>
</dependency>

2.如果使用带有SNAPSHOT后缀的包,请添加该仓库

<repositories>
    <repository>
      <id>oss-snapshots</id>
      <url>https://oss.sonatype.org/content/repositories/snapshots</url>
      <releases>
        <enabled>true</enabled>
      </releases>
      <snapshots>
        <enabled>true</enabled>
      </snapshots>
    </repository>
  </repositories>

一、独有优点:

重大更新:

1.3.0更新内容: 使用jetty作为嵌入式热加载默认实现(只要java文件进行编译就会重新加载),resty-captcha验证码功能...

1.2.0更新内容:使用header来控制api版本,基于数据源的读写分离,更简单的tableSetting.详情查看

1.1.0版本重大更新:快速接入spring,缓存,加密,header,XForwardedSupports等,详情查看

Record的时代已经到来,你完全不用使用任何的model来执行你的数据

//创建record的执行器  针对sec_user表 并开启缓存
Record recordDAO = new Record("sec_user");
//使用当前数据源和表数据 new一个对象来保存数据
recordDAO.reNew().set("属性", "值").save();
Record r1 = recordDAO.reNew().set("属性", "值");
Record r2 = recordDAO.reNew().set("属性", "值");
//批量保存
recordDAO.save(r1, r2);
//更新
r2.set("属性", "值").update()
//查询全部
List<Record> records = recordDAO.findAll();
//条件查询
recordDAO.findBy(where,paras)
//分页查询
Page<Record> records = recordDAO.paginateAll();
//根据id删除
recordDAO.deleteById("1");

//本次查询放弃使用cache 
recordDAO.unCache().findBy(where,paras);
//把record的数据源切换到dsmName数据源上
recordDAO.useDS(dsmName).findBy(where,paras);

//等等,完全摆脱model,实现快速操作数据

Model支持动态切换数据源和本次查询放弃使用cache

User dao=new User();
//本次查询放弃使用cache 
dao.unCache().findBy(where,paras);
//把model的数据源切换到dsmName数据源上
dao.useDS(dsmName).findBy(where,paras);

//数据库和全局参数配置移植到application.properties 详情参看resty-example

#not must auto load
app.encoding=UTF-8
app.devEnable=true
app.showRoute=false
app.cacheEnabled=true
#默认使用ehcacheProvider
#app.cacheProvider=cn.dreampie.cache.redis.RedisProvider

##druid plugin auto load
db.default.url=jdbc:mysql://127.0.0.1/example?useUnicode=true&characterEncoding=UTF-8
db.default.user=dev
db.default.password=dev1010
db.default.dialect=mysql

#c3p0配置
c3p0.default.minPoolSize=3
c3p0.default.maxPoolSize=20

#druid配置
#druid.default.initialSize=10
#druid.default.maxPoolPreparedStatementPerConnectionSize=20
#druid.default.timeBetweenConnectErrorMillis=1000
#druid.default.filters=slf4j,stat,wall

#flyway database migration auto load
flyway.default.valid.clean=true
flyway.default.migration.auto=true
flyway.default.migration.initOnMigrate=true


db.demo.url=jdbc:mysql://127.0.0.1/demo?useUnicode=true&characterEncoding=UTF-8
db.demo.user=dev
db.demo.password=dev1010
db.demo.dialect=mysql
#druid
druid.demo.initialSize=10
druid.demo.maxPoolPreparedStatementPerConnectionSize=20
druid.demo.timeBetweenConnectErrorMillis=1000
druid.demo.filters=slf4j,stat,wall
#flyway
flyway.demo.valid.clean=true
flyway.demo.migration.auto=true
flyway.demo.migration.initOnMigrate=true



//数据库的配置精简  自动从文件读取参数  只需配置model扫描目录 和dsmName
public void configPlugin(PluginLoader pluginLoader) {
  //第一个数据库
  ActiveRecordPlugin activeRecordPlugin = new ActiveRecordPlugin(new DruidDataSourceProvider("default"), true);
  activeRecordPlugin.addIncludePaths("cn.dreampie.resource");
  pluginLoader.add(activeRecordPlugin);
}

1.极简的route设计,完全融入普通方法的方式,方法参数就是请求参数,方法返回值就是数据返回值

  @GET("/users/:name")
  //在路径中自定义解析的参数 如果有其他符合 也可以用 /users/{name}
  // 参数名就是方法变量名  除路径参数之外的参数也可以放在方法参数里  传递方式 user={json字符串}
  public Map find(String name,User user) {
    // return Lister.of(name);
    return Maper.of("k1", "v1,name:" + name, "k2", "v2");
    //返回什么数据直接return
  }

2.极简的activerecord设计,数据操作只需短短的一行,支持批量保存对象

  //批量保存
  User u1 = new User().set("username", "test").set("providername", "test").set("password", "123456");
  User u2 = new User().set("username", "test").set("providername", "test").set("password", "123456");
  User.dao.save(u1,u2);

  //普通保存
  User u = new User().set("username", "test").set("providername", "test").set("password", "123456");
  u.save();

  //更新
  u.update();
  //条件更新
  User.dao.updateBy(columns,where,paras);
  User.dao.updateAll(columns,paras);

  //删除
  u.deleted();
  //条件删除
  User.dao.deleteBy(where,paras);
  User.dao.deleteAll();

  //查询
  User.dao.findById(id);
  User.dao.findBy(where,paras);
  User.dao.findAll();

  //分页
  User.dao.paginateBy(pageNumber,pageSize,where,paras);
  User.dao.paginateAll(pageNumber,pageSize);

3.极简的客户端设计,支持各种请求,文件上传和文件下载(支持断点续传)

  Client httpClient=null;//创建客户端对象
  //启动resty-example项目,即可测试客户端
  String apiUrl = "http://localhost:8081/api/v1.0";
  //如果不需要 使用账号登陆
  //httpClient = new Client(apiUrl);
  //如果有账号权限限制  需要登陆
  httpClient = new Client(apiUrl, "/tests/login", "u", "123");

  //该请求必须  登陆之后才能访问  未登录时返回 401  未认证
  ClientRequest authRequest = new ClientRequest("/users");
  ClientResult authResult = httpClient.build(authRequest).get();
  System.out.println(authResult.getResult());

  //get
  ClientRequest getRequest = new ClientRequest("/tests");
  ClientResult getResult = httpClient.build(getRequest).get();
  System.out.println(getResult.getResult());

  //post
  ClientRequest postRequest = new ClientRequest("/tests");
  postRequest.addParam("test", Jsoner.toJSONString(Maper.of("a", "谔谔")));
  ClientResult postResult = httpClient.build(postRequest).post();
  System.out.println(postResult.getResult());

  //put
  ClientRequest putRequest = new ClientRequest("/tests/x");
  ClientResult putResult = httpClient.build(putRequest).put();
  System.out.println(putResult.getResult());


  //delete
  ClientRequest deleteRequest = new ClientRequest("/tests/a");
  ClientResult deleteResult = httpClient.build(deleteRequest).delete();
  System.out.println(deleteResult.getResult());


  //upload
  ClientRequest uploadRequest = new ClientRequest("/tests/resty");
  uploadRequest.addUploadFiles("resty", ClientTest.class.getResource("/resty.jar").getFile());
  uploadRequest.addParam("des", "test file  paras  测试笔");
  ClientResult uploadResult = httpClient.build(uploadRequest).post();
  System.out.println(uploadResult.getResult());


  //download  支持断点续传
  ClientRequest downloadRequest = new ClientRequest("/tests/file");
  downloadRequest.setDownloadFile(ClientTest.class.getResource("/resty.jar").getFile().replace(".jar", "x.jar"));
  ClientResult downloadResult = httpClient.build(downloadRequest).get();
  System.out.println(downloadResult.getResult());

4.支持多数据源和嵌套事务(使用场景:需要访问多个数据库的应用,或者作为公司内部的数据中间件向客户端提供数据访问api等)

  // 在resource里使用事务,也就是controller里,rest的世界认为所以的请求都表示资源,所以这儿叫resource
  @GET("/users")
  @Transaction(name = {"default", "demo"}) //多数据源的事务,如果你只有一个数据库  直接@Transaction 不需要参数
  public User transaction() {
  //TODO 用model执行数据库的操作  只要有操作抛出异常  两个数据源 都会回滚  虽然不是分布式事务  也能保证代码块的数据执行安全
  }

  // 如果你需要在service里实现事务,通过java动态代理(必须使用接口,jdk设计就是这样)
  public interface UserService {
    @Transaction(name = {"demo"})//service里添加多数据源的事务,如果你只有一个数据库  直接@Transaction 不需要参数
    public User save(User u);
  }
  // 在resource里使用service层的 事务
  // @Transaction(name = {"demo"})的注解需要写在service的接口上
  // 注意java的自动代理必须存在接口
  // TransactionAspect 是事务切面 ,你也可以实现自己的切面比如日志的Aspect,实现Aspect接口
  // 再private UserService userService = AspectFactory.newInstance(new UserServiceImpl(), new TransactionAspect(),new LogAspect());
  private UserService userService = AspectFactory.newInstance(new UserServiceImpl(), new TransactionAspect());

5.极简的权限设计,可以通过cache支持分布式session,你只需要实现一个简单接口和添加一个拦截器,即可实现基于url的权限设计

  public void configInterceptor(InterceptorLoader interceptorLoader) {
    //权限拦截器 放在第一位 第一时间判断 避免执行不必要的代码
    interceptorLoader.add(new SecurityInterceptor(new MyAuthenticateService()));
  }

  //实现接口
  public class MyAuthenticateService implements AuthenticateService {
    //登陆时 通过name获取用户的密码和权限信息
    public Principal findByName(String name) {
      DefaultPasswordService defaultPasswordService = new DefaultPasswordService();

      Principal principal = new Principal(name, defaultPasswordService.hash("123"), new HashSet<String>() {{
        add("api");
      }});
      return principal;
    }
    //基础的权限总表  所以的url权限都放在这儿  你可以通过 文件或者数据库或者直接代码 来设置所有权限
    public Set<Credential> loadAllCredentials() {
      Set<Credential> credentials = new HashSet<Credential>();
      credentials.add(new Credential("GET", "/api/v1.0/users**", "users"));
      return credentials;
    }
  }

6.极简的缓存设计,可扩展,非常简单即可启用model的自动缓存功能

  //启用缓存并在要自动使用缓存的model上
  //config application.properties  app.cacheEnabled=true
  //开启缓存@Table(name = "sec_user", cached = true)

  @Table(name = "sec_user", cached = true)
  public class User extends Model<User> {
    public static User dao = new User();

  }

7.下载文件,只需要直接return file

  @GET("/files")
  public File file() {
    return new File(path);
  }

8.上传文件,注解配置把文件写到服务器

  @POST("/files")
  @FILE(dir = "/upload/") //配置上传文件的相关信息
  public UploadedFile file(UploadedFile file) {
    return file;
  }

9.当然也是支持传统的web开发,你可以自己实现数据解析,在config里添加自定义的解析模板

  public void configConstant(ConstantLoader constantLoader) {
    // 通过后缀来返回不同的数据类型  你可以自定义自己的  render  如:FreemarkerRender
    //默认已添加json和text的支持,只需要把自定义的Render add即可
    // constantLoader.addRender("json", new JsonRender());
  }

二、运行example示例:

1.在本地mysql数据库里创建demo,example数据库,对应application.properties的数据库配置

2.运行resty-example下的pom.xml->flyway-maven-plugin:migrate,自动根具resources下db目录下的数据库文件生成数据库表结构

3.运行resty-example下的pom.xml->tomcat6-maven-plugin:run,启动example程序

提醒:推荐idea作为开发ide,使用分模块的多module开发

License Apache License V2

捐赠: 支付宝

resty's People

Contributors

dependabot[bot] avatar dreampie avatar flylb avatar gitter-badger avatar zhouyijiaren 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

resty's Issues

Resty的单点登录问题

如果我使用了单点登录,这个时候我只能拿到用户除密码外的信息,如何达到Subject.login的效果,能不能跳过密码验证直接写入username?
image

使用Redis作为缓存,model save后,清理缓存感觉没成功

使用Redis作为缓存,model save后,清理缓存感觉没成功,立即查询数据,经过调试还是从缓存中获得了数据(之前的老数据)

检查了一下,model查询生成的缓存为
_query::default::biz_device::_query::default::biz_device::Device::SELECT * FROM biz_device WHERE 1=1 order by code LIMIT 20 OFFSET 0::[]

然后在save model的时候去删除的为_query::default::biz_device::keys,结果并没有删掉,是我哪个地方使用的不对?

Resource方法配置@Transaction,不起作用

代码如下:
@API("/orderFeedback")
public class OrderFeedbackResource extends ApiResource {
@post("/orderSign")‘’
‘’@transaction
public Map orderSign(OrderPositionLog HEAD, OrderSign XML_DATA){
//共5条,保存2条后,抛出RuntimeException,数据库中前两条保存进去了。没有起到事务的作用。
}
}

AppConfig类
‘interceptorLoader.add(new TransactionInterceptor());’

登录成功后credentials里面添加的路径依然不能访问并且tomcat报错,credentials.add(new Credential("*", "/api/v1.0/users/**", "users"))

credentials.add(new Credential("*", "/api/v1.0/users/", "users"))初次访问时,**postman测试工具显示

status: 401 Unauthorized body里面显示Unauthorized,http://localhost:8088/resty/api/v1.0/sessions输入正确的用户名密码后 body显示当前登录用户的详细信息,此时登录成功
再次访问http://localhost:8088/resty/api/v1.0/users 显示500 Internal Server Error, body里面什么都不显示,

tomcat 里的错误信息如下

16-06-07 16:55:11.363 [http-apr-8088-exec-34] INFO cn.dreampie.route.core.Route -

Match route ----------------- 2016-06-07 16:55:11 ------------------------------
Resource : cn.dreampie.resource.user.UserResource(UserResource.java:29)
Method : findAll
PathPattern : GET /api1.0/users
ContentType : null
PathParams :
ReturnType : java.util.List<cn.dreampie.resource.user.model.User>
Interceptors : cn.dreampie.route.cache.CacheInterceptor(CacheInterceptor.java:36)
cn.dreampie.route.interceptor.security.SecurityInterceptor(SecurityInterceptor.java:29)

cn.dreampie.route.interceptor.transaction.TransactionInterceptor(TransactionInterceptor.java:21)

16-06-07 16:55:11.364 [http-apr-8088-exec-34] DEBUG cn.dreampie.cache.SimpleCache - Hit, group: {_http::/users}, key: {/users}
16-06-07 16:55:11.364 [http-apr-8088-exec-34] DEBUG cn.dreampie.cache.SimpleCache - Miss, group: {_http::/users}, key: {/api1.0/users}
16-06-07 16:55:11.364 [http-apr-8088-exec-34] DEBUG cn.dreampie.security.SessionBuilder - Session key was: 811d5d3b-8ac4-4d5e-8e77-76743fe65683.
16-06-07 16:55:11.364 [http-apr-8088-exec-34] DEBUG cn.dreampie.cache.SimpleCache - Hit, group: {_session}, key: {811d5d3b-8ac4-4d5e-8e77-76743fe65683}
16-06-07 16:55:11.364 [http-apr-8088-exec-34] DEBUG cn.dreampie.cache.SimpleCache - Hit, group: {_session}, key: {testhttp-apr-8080-exec-10}
16-06-07 16:55:11.364 [http-apr-8088-exec-34] DEBUG net.sf.ehcache.store.disk.Segment - put added 0 on heap
16-06-07 16:55:11.366 [http-apr-8088-exec-34] DEBUG net.sf.ehcache.store.disk.Segment - put updated, deleted 0 on heap
16-06-07 16:55:11.367 [http-apr-8088-exec-34] DEBUG net.sf.ehcache.store.disk.Segment - put updated, deleted 0 on disk
16-06-07 16:55:11.367 [http-apr-8088-exec-34] DEBUG cn.dreampie.security.SessionBuilder - Found session success, username was: testhttp-apr-8080-exec-10.
16-06-07 16:55:11.367 [http-apr-8088-exec-34] DEBUG cn.dreampie.cache.SimpleCache - Hit, group: {_credential}, key: {_allCredentials}
16-06-07 16:55:11.367 [http-apr-8088-exec-34] INFO  cn.dreampie.security.Subject - GET /api1.0/users need credential users
16-06-07 16:55:11.367 [http-apr-8088-exec-34] DEBUG cn.dreampie.cache.SimpleCache - Hit, group: {_principal}, key: {testhttp-apr-8080-exec-10}
16-06-07 16:55:11.367 [_session.data] DEBUG net.sf.ehcache.store.disk.Segment - fault removed 0 from heap
16-06-07 16:55:11.367 [_session.data] DEBUG net.sf.ehcache.store.disk.Segment - fault added 0 on disk
16-06-07 16:55:11.372 [http-apr-8088-exec-34] WARN  cn.dreampie.route.holder.DefaultExceptionHolder - Request "GET /api1.0/users" error : 400 null
java.lang.NullPointerException: null
    at cn.dreampie.security.Principal.hasCredential(Principal.java:50) ~[Principal.class:na]
    at cn.dreampie.security.Subject.check(Subject.java:217) ~[Subject.class:na]
    at cn.dreampie.route.interceptor.security.SecurityInterceptor.intercept(SecurityInterceptor.java:35) ~[SecurityInterceptor.class:na]
    at cn.dreampie.route.core.RouteInvocation.methodInvoke(RouteInvocation.java:54) ~[RouteInvocation.class:na]
    at cn.dreampie.route.core.RouteInvocation.invoke(RouteInvocation.java:189) ~[RouteInvocation.class:na]
    at cn.dreampie.route.cache.CacheInterceptor.intercept(CacheInterceptor.java:69) ~[CacheInterceptor.class:na]
    at cn.dreampie.route.core.RouteInvocation.methodInvoke(RouteInvocation.java:54) ~[RouteInvocation.class:na]
    at cn.dreampie.route.core.RouteInvocation.invoke(RouteInvocation.java:189) ~[RouteInvocation.class:na]
    at cn.dreampie.route.core.RouteHandler.handle(RouteHandler.java:67) ~[RouteHandler.class:na]
    at cn.dreampie.route.handler.cors.CORSHandler.handle(CORSHandler.java:102) ~[CORSHandler.class:na]
    at cn.dreampie.route.RestyFilter.doFilter(RestyFilter.java:82) ~[RestyFilter.class:na]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) [catalina.jar:7.0.52]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) [catalina.jar:7.0.52]
    at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:123) [druid-1.0.13.jar:1.0.13]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) [catalina.jar:7.0.52]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) [catalina.jar:7.0.52]
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) [catalina.jar:7.0.52]
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) [catalina.jar:7.0.52]
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) [catalina.jar:7.0.52]
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) [catalina.jar:7.0.52]
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) [catalina.jar:7.0.52]
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) [catalina.jar:7.0.52]
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) [catalina.jar:7.0.52]
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) [catalina.jar:7.0.52]
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040) [tomcat-coyote.jar:7.0.52]
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607) [tomcat-coyote.jar:7.0.52]
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2441) [tomcat-coyote.jar:7.0.52]
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2430) [tomcat-coyote.jar:7.0.52]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [na:1.7.0_75]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [na:1.7.0_75]
    at java.lang.Thread.run(Thread.java:745) [na:1.7.0_75]

sql injection violation

"sql injection violation, syntax error: TODO : SET @ranking=0;select * from select *,@ranking:=@ranking+1 AS ranking from view_attendance where work_long_total_day is not null and attend_date='2016-08-03' ORDER BY work_long_total_day DESC) as result where userId= 12163 LIMIT 1 OFFSET 0"

jar包依赖问题

我在用resty-demo做实验,把resty-demo中与resty相关的jar包都删掉了,用的源码。但是出现了这种问题
import cn.dreampie.route.core.annotation.API;
import cn.dreampie.route.core.annotation.GET;
error:The import cn.dreampie.route.core.annotation cannot be resolved

如何修改项目请求地址

现在项目要部署到一个内部公共平台上,部署后无法访问。根据以前springMVC项目部署经验要修改ServletRequest中的地址,即
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain){
request.setAttribute("ctx", "");
request.setAttribute("ctx_url", "/");
chain.doFilter(request, response);
}

想要的结果是,本地tds.war包扔到tomcat下,访问地址为:123.1.1.123:80/tds,现在部署到平台上后访问地址为:10.1.1.3:80,我无权修改配置,只能改代码

需求Subject.removePrincipal(String username)方法

遇到的case如下
前提条件

  1. 没有启用缓存

流程

  1. 更新账户密码,注意并不是更新自己的密码,而是作为管理员更新其他账户的密码
  2. 立即使用新账户密码登录失败(只有重启后才能成功)

原因:
检查代码是因为Subject.credentials中有principals的缓存,但是没有找到方法清理principals

请指导一下

api接口集合处理咨询

从数据库获取列表数据,列表中每条数据都对应有一个json数组详情数据,框架有没有对集合处理的方法?如通过访问2次数据库,1获取列表,2获取列表对应的数组json详情数据,再通过方法左关联组合两组数据形成一组数据,有这类方法吗?就像C#的linq、lambda

cached 拦截器中method失效问题

cacheInterceptor中,method失效时间是可以自定义的,但是框架中对于失效时间,例如我method中用到的表更新了,method在缓存中不会失效吧

用表单上传文件,multipart/form-data,中文字段正常,用Client操作则为乱码

用表单上传文件,加上<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
表单上传中文可正常显示。

<form action="http://localhost:8080/restcenter/api/finger" method="post" enctype="multipart/form-data">
文件:<input type="file" name="f"><br />
中文:<input type="text" name="s" value="中文测试"><br />
<input type="submit" value="Submit" />
</form>

如果用Client,则显示为乱码

    @Test
    public void testPost3() throws FileNotFoundException {
        Client client = new Client(apiUrl);
        ClientRequest crequest = new ClientRequest("/finger");
        crequest.addUploadFile("f", "C:/Users/zhubo/Pictures/002.jpg");
        crequest.addParam("s", "中文测试");
        ClientResult cresult = client.build(crequest).post();
        System.out.println(cresult.getResult());
    }

Route method invoke error.

请问在进行对象保存操作的时,发生这个错误,其中Sign的字段内容为id,content,u_id,createdate

@API("/sign")
public class SignResource extends ApiResource {

@POST("/save")
public Map save(Sign sign) {

    //check is submit >5

    System.out.println(sign.toJson());

    Long todayCount = Sign.dao.countBy("t_sign.u_id = ? and TO_DAYS(NOW()) -TO_DAYS(t_sign.createdate) <=1", sign.get("uId"));

    System.out.println("todayCount-->" + todayCount);

    if (null != todayCount && todayCount < 5) {
        //save
        return Maper.of("data", Sign.dao.save());

    } else {
        return Maper.of("code", 500, "msg", "count>5");
    }
}

Thanks!

使用了事务注解没生效,麻烦看看是什么情况

代码帖在下面,第一次用,不知道怎么格式化。将就下了。我在service层加了注解,然后用的时候,比如说在执行Log这个对象保存的时候异常了,但是之前的User保存还是被执行了。不知道是不是哪个地方需要改改,求解

- service@Transaction
public boolean login(User u);

- serviceImplpublic boolean login(User u) {
  boolean result = u.update();
  if(result){
    result = new Log().set("user_id", u.get("id")).set("operator_id", u.get("operator_id")).set("create_date", new Date()).save();
    }
    return result;
}

- resource
@POST(value="/login",des="用户登陆")
public String login(String username,String password,String password_) {
          try {
              User user = new User().set("login_name", username).set("login_pwd", password);
              boolean result = userService.login(user);
              if(result){
                  return "OK";
              }else{
                  return "No";
              }
          } catch (Exception e) {
              e.printStackTrace();
              return "No";
          }
      }

java.lang.IllegalStateException

错误信息如下:
14-Apr-2015 14:45:20.278 INFO [_session.data] org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading Illegal access: this web application instance has been stopped already. Could not load [net.sf.ehcache.store.disk.DiskStore$KeySet]. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access.
java.lang.IllegalStateException: Illegal access: this web application instance has been stopped already. Could not load [net.sf.ehcache.store.disk.DiskStore$KeySet]. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access.
at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading(WebappClassLoaderBase.java:1327)
at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForClassLoading(WebappClassLoaderBase.java:1313)
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1196)
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1157)
at net.sf.ehcache.store.disk.DiskStore.keySet(DiskStore.java:521)
at net.sf.ehcache.store.disk.DiskStorageFactory$DiskExpiryTask.run(DiskStorageFactory.java:828)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)

json 返回的构建?

1
2
返回值没有user:{"address":"honghuaguang","comment_count":1,"content":"sdfsd","coord":"guangzhou","create_at":"2015-09-28","device":"android","id":1,"imgeurl":"sdfsd","like_count":12,"liked":1,"location":"china","owner_id":1}

user在数据库没有对应的实体表,(只是真正user的几个字段),这种情况应该怎么搞??

User和UserInfo的问题

UserInfo的数据是在什么时候获取到的?
是每次获取User的时候就会获取UserInfo吗,我看到 User类中getUserInfos方法并没有被直接调用,这里是怎么调用的呢,是用反射吗,在哪里反射的?

Release 1.0 使用post请求时的unhandled exception

使用1.0snapshot于play framework,执行post操作时,出现unhandled exception。具体如下:
Job DEFAULT.6da64b5bd2ee-d729633d-d859-40b4-8b4d-0f1ff53faec8 threw an unhandled Exception:
cn.dreampie.client.exception.ClientException: null
at cn.dreampie.client.Client.ask(Client.java:57)

其中 post数据是json格式,其中有个parameter是String形式的float数值,叫做"limit":"100.0",这个值只要是数字形式就一定触发此exception,然而无意间用科学计数存入 limit:"1.0E6",exception不再出现。后测试其他,只要含字母就不会出现。不太理解其原因。

另外,这个访问url和post json用curl试过,完全没有问题。

demo部署到paas 上,客户端调用抛出异常

异常信息如下
[WARN] 2015-08-12 17:25:46,852 cn.dreampie.route.holder.DefaultExceptionHolder - Request "POST /api1.0/tests/0" error : 400 Unauthorized proxy request from 59.174.45.43
If you are the application developer or operator, you can set resty.http.XForwardedSupport
system property to allow proxy requests from this proxy IP with:
-Dresty.http.XForwardedSupport=59.174.45.43
Or if you want to allow any proxy request:
-Dresty.http.XForwardedSupport=all
java.lang.IllegalArgumentException: Unauthorized proxy request from 59.174.45.43
If you are the application developer or operator, you can set resty.http.XForwardedSupport
system property to allow proxy requests from this proxy IP with:
-Dresty.http.XForwardedSupport=59.174.45.43
Or if you want to allow any proxy request:
-Dresty.http.XForwardedSupport=all
at cn.dreampie.common.http.AbstractRequest.checkProxyRequest(AbstractRequest.java:98)
at cn.dreampie.common.http.AbstractRequest.getClientAddress(AbstractRequest.java:85)
at cn.dreampie.security.SessionBuilder.getSession(SessionBuilder.java:94)
at cn.dreampie.security.SessionBuilder.buildSession(SessionBuilder.java:147)
at cn.dreampie.security.SessionBuilder.in(SessionBuilder.java:43)
at cn.dreampie.route.interceptor.security.SecurityInterceptor.intercept(SecurityInterceptor.java:49)
at cn.dreampie.route.core.RouteInvocation.invoke(RouteInvocation.java:49)
at cn.dreampie.route.core.RouteHandler.handle(RouteHandler.java:67)
at cn.dreampie.route.handler.cors.CORSHandler.handle(CORSHandler.java:102)
at cn.dreampie.route.RestyFilter.doFilter(RestyFilter.java:82)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:683)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)

fastcgi 远程命令执行漏洞

fastcgi 1.2.24之前的版本存在远程命令执行漏洞,请更新fastcgi版本。否则调用cn.dreampie.common.util.json.Jsoner的toObject函数的地方都存在远程命令执行

Resty怎么获取Session?

调试的时候debugger里面可以this.getRequest().request.getSession().getAttributeNames()获取,
1

但是代码里this.getRequest()里面没有request,这个时候我该怎么获取Session呢?

image

运行resty-example下的pom.xml->tomcat6-maven-plugin:run,启动example程序,报错无法启动。

java.lang.ClassCastException: com.alibaba.druid.support.http.WebStatFilter cannot be cast to javax.servlet.Filter和 The web application [/resty-example] appears to have started a thread na
med [Abandoned connection cleanup thread] but has failed to stop it. This is very likely to create a memory leak.这2个错误,请问该如何解决。
JDK为1.7.0_21
MySql为mysql-5.6.25-winx64

F:\it\Resty\resty-example>mvn clean tomcat:run
[INFO] Scanning for projects...
[WARNING]
[WARNING] Some problems were encountered while building the effective model for
cn.dreampie:resty-example:war:1.0
[WARNING] 'version' contains an expression but should be a constant. @ cn.dreamp
ie:resty-example:${project.parent.version}, F:\it\Resty\resty-example\pom.xml, l
ine 12, column 12
[WARNING]
[WARNING] It is highly recommended to fix these problems because they threaten t
he stability of your build.
[WARNING]
[WARNING] For this reason, future Maven versions might no longer support buildin
g such malformed projects.
[WARNING]
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building resty-example 1.0
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ resty-example ---
[INFO] Deleting F:\it\Resty\resty-example\target
[INFO]
[INFO] >>> tomcat-maven-plugin:1.1:run (default-cli) > compile @ resty-example >

[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ resty-exam
ple ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 7 resources
[INFO]

[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ resty-example -

[INFO] Changes detected - recompiling the module!
[INFO] Compiling 13 source files to F:\it\Resty\resty-example\target\classes
[WARNING] /F:/it/Resty/resty-example/src/main/java/cn/dreampie/config/MyAuthenti
cateService.java: F:\it\Resty\resty-example\src\main\java\cn\dreampie\config\MyA
uthenticateService.java使用了未经检查或不安全的操作。
[WARNING] /F:/it/Resty/resty-example/src/main/java/cn/dreampie/config/MyAuthenti
cateService.java: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。
[INFO]
[INFO] <<< tomcat-maven-plugin:1.1:run (default-cli) < compile @ resty-example <
<<
[INFO]
[INFO] --- tomcat-maven-plugin:1.1:run (default-cli) @ resty-example ---
[INFO] Running war on http://localhost:8080/resty-example
[INFO] Creating Tomcat server configuration at F:\it\Resty\resty-example\target
tomcat
七月 18, 2015 11:05:37 下午 org.apache.catalina.startup.Embedded start
INFO: Starting tomcat server
七月 18, 2015 11:05:37 下午 org.apache.catalina.core.StandardEngine start
INFO: Starting Servlet Engine: Apache Tomcat/6.0.29
23:05:38,142 |-INFO in ch.qos.logback.classic.LoggerContext[resty-example] - Cou
ld NOT find resource [logback.groovy]
23:05:38,142 |-INFO in ch.qos.logback.classic.LoggerContext[resty-example] - Cou
ld NOT find resource [logback-test.xml]
23:05:38,142 |-INFO in ch.qos.logback.classic.LoggerContext[resty-example] - Fou
nd resource [logback.xml] at [file:/F:/it/Resty/resty-example/target/classes/log
back.xml]
23:05:38,180 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction -
debug attribute not set
23:05:38,193 |-INFO in ch.qos.logback.classic.joran.action.ContextNameAction - S
etting logger context name as [resty-example]
23:05:38,193 |-WARN in ch.qos.logback.core.joran.action.PropertyAction - [substi
tutionProperty] element has been deprecated. Please use the [property] element i
nstead.
23:05:38,195 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About t
o instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
23:05:38,198 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming
appender as [STDOUT]
23:05:38,244 |-WARN in ch.qos.logback.core.ConsoleAppender[STDOUT] - This append
er no longer admits a layout as a sub-component, set an encoder instead.
23:05:38,244 |-WARN in ch.qos.logback.core.ConsoleAppender[STDOUT] - To ensure c
ompatibility, wrapping your layout in LayoutWrappingEncoder.
23:05:38,244 |-WARN in ch.qos.logback.core.ConsoleAppender[STDOUT] - See also ht
tp://logback.qos.ch/codes.html#layoutInsteadOfEncoder for details
23:05:38,244 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About t
o instantiate appender of type [ch.qos.logback.core.FileAppender]
23:05:38,246 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming
appender as [FILE]
23:05:38,248 |-WARN in ch.qos.logback.core.FileAppender[FILE] - This appender no
longer admits a layout as a sub-component, set an encoder instead.
23:05:38,248 |-WARN in ch.qos.logback.core.FileAppender[FILE] - To ensure compat
ibility, wrapping your layout in LayoutWrappingEncoder.
23:05:38,248 |-WARN in ch.qos.logback.core.FileAppender[FILE] - See also http://
logback.qos.ch/codes.html#layoutInsteadOfEncoder for details
23:05:38,248 |-INFO in ch.qos.logback.core.FileAppender[FILE] - File property is
set to [./logs/resty-example.log]
23:05:38,250 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Se
tting level of ROOT logger to DEBUG
23:05:38,250 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Atta
ching appender named [STDOUT] to Logger[ROOT]
23:05:38,251 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Atta
ching appender named [FILE] to Logger[ROOT]
23:05:38,251 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction -
End of configuration.
23:05:38,251 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@11220055 -
Registering current configuration as safe fallback point

七月 18, 2015 11:05:38 下午 org.apache.catalina.core.StandardContext filterStart

SEVERE: Exception starting filter DruidWebStatFilter
java.lang.ClassCastException: com.alibaba.druid.support.http.WebStatFilter canno
t be cast to javax.servlet.Filter
at org.apache.catalina.core.ApplicationFilterConfig.getFilter(Applicatio
nFilterConfig.java:275)
at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(Applica
tionFilterConfig.java:422)
at org.apache.catalina.core.ApplicationFilterConfig.(ApplicationFi
lterConfig.java:115)
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.
java:4001)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4
651)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)

    at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)

    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:445

)
at org.apache.catalina.startup.Embedded.start(Embedded.java:825)
at org.codehaus.mojo.tomcat.AbstractRunMojo.startContainer(AbstractRunMo
jo.java:558)
at org.codehaus.mojo.tomcat.AbstractRunMojo.execute(AbstractRunMojo.java
:255)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(Default
BuildPluginManager.java:132)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor
.java:208)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor
.java:153)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor
.java:145)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProje
ct(LifecycleModuleBuilder.java:116)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProje
ct(LifecycleModuleBuilder.java:80)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThre
adedBuilder.build(SingleThreadedBuilder.java:51)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(Lifecycl
eStarter.java:120)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:355)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:155)
at org.apache.maven.cli.MavenCli.execute(MavenCli.java:584)
at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:216)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:160)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Laun
cher.java:289)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.jav
a:229)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(La
uncher.java:415)
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:
356)

七月 18, 2015 11:05:38 下午 org.apache.catalina.core.StandardContext filterStart

SEVERE: Exception starting filter RestyFilter
java.lang.ClassCastException: cn.dreampie.route.RestyFilter cannot be cast to ja
vax.servlet.Filter
at org.apache.catalina.core.ApplicationFilterConfig.getFilter(Applicatio
nFilterConfig.java:275)
at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(Applica
tionFilterConfig.java:422)
at org.apache.catalina.core.ApplicationFilterConfig.(ApplicationFi
lterConfig.java:115)
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.
java:4001)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4
651)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)

    at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)

    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:445

)
at org.apache.catalina.startup.Embedded.start(Embedded.java:825)
at org.codehaus.mojo.tomcat.AbstractRunMojo.startContainer(AbstractRunMo
jo.java:558)
at org.codehaus.mojo.tomcat.AbstractRunMojo.execute(AbstractRunMojo.java
:255)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(Default
BuildPluginManager.java:132)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor
.java:208)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor
.java:153)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor
.java:145)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProje
ct(LifecycleModuleBuilder.java:116)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProje
ct(LifecycleModuleBuilder.java:80)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThre
adedBuilder.build(SingleThreadedBuilder.java:51)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(Lifecycl
eStarter.java:120)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:355)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:155)
at org.apache.maven.cli.MavenCli.execute(MavenCli.java:584)
at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:216)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:160)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Laun
cher.java:289)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.jav
a:229)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(La
uncher.java:415)
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:
356)

七月 18, 2015 11:05:38 下午 org.apache.catalina.core.StandardContext start
SEVERE: Error filterStart
七月 18, 2015 11:05:38 下午 org.apache.catalina.core.StandardContext start
SEVERE: Context [/resty-example] startup failed due to previous errors
七月 18, 2015 11:05:38 下午 org.apache.catalina.loader.WebappClassLoader clearRe
ferencesJdbc
SEVERE: The web application [/resty-example] registered the JBDC driver [com.ali
baba.druid.proxy.DruidDriver] but failed to unregister it when the web applicati
on was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unre
gistered.
七月 18, 2015 11:05:38 下午 org.apache.catalina.loader.WebappClassLoader clearRe
ferencesJdbc
SEVERE: The web application [/resty-example] registered the JBDC driver [com.ali
baba.druid.mock.MockDriver] but failed to unregister it when the web application
was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregi
stered.
七月 18, 2015 11:05:38 下午 org.apache.catalina.loader.WebappClassLoader clearRe
ferencesJdbc
SEVERE: The web application [/resty-example] registered the JBDC driver [com.mys
ql.jdbc.Driver] but failed to unregister it when the web application was stopped
. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
七月 18, 2015 11:05:38 下午 org.apache.catalina.loader.WebappClassLoader clearRe
ferencesJdbc
SEVERE: The web application [/resty-example] registered the JBDC driver [com.mys
ql.fabric.jdbc.FabricMySQLDriver] but failed to unregister it when the web appli
cation was stopped. To prevent a memory leak, the JDBC Driver has been forcibly
unregistered.
七月 18, 2015 11:05:38 下午 org.apache.catalina.loader.WebappClassLoader clearRe
ferencesThreads
SEVERE: The web application [/resty-example] appears to have started a thread na
med [Abandoned connection cleanup thread] but has failed to stop it. This is very likely to create a memory leak.

关于Subject取值问题

请问Subject.set(key,value)这种赋值是正对当前用户,还是所有用户?可不可以把Subject理解为当前用户的Session?

resty 使用权限访问API时,使用登陆测试代码后,浏览器访问就不用登陆就可访问API

'''
package cn.dreampie.config;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

import cn.dreampie.resource.user.model.User;
import cn.dreampie.route.annotation.DELETE;
import cn.dreampie.route.annotation.POST;
import cn.dreampie.security.AuthenticateService;
import cn.dreampie.security.PasswordService;
import cn.dreampie.security.Principal;
import cn.dreampie.security.Subject;
import cn.dreampie.security.credential.Credential;

/**

  • Created by ice on 15-1-7.
    */
    public class MyAuthenticateService extends AuthenticateService {
    public PasswordService getPasswordService() {
    return super.getPasswordService();
    }

    /**

    • 查询用户信息 这儿new一个用户对象来模拟
      *
    • @param username
    •        登录的用户名
      
    • @return 用户权限对象
      */
      // public Principal getPrincipal(String username) {
      // PasswordService passwordService = getPasswordService();
      // User u = new User().set("username", username)
      // .set("password", passwordService.crypto("123", "x"))
      // .put("permissions", new HashSet() {
      // {
      // add("users");
      // }
      // });
      //
      // Principal principal = new Principal(
      // u. get("username"), u. get("password"), "x",
      // (Set) u.get("permissions"), u);
      // return principal;
      // }

    public Principal getPrincipal(String username) {
    PasswordService passwordService = getPasswordService();

    /*
     * User u = new User().set("username", username).set("password",
     * passwordService.crypto("123", "x")).put("permissions", new
     * HashSet<String>() {{ add("users"); }});
     */
    Set<String> credentials = new HashSet<String>();
    credentials.add("users");
    credentials.add("news");
    Principal<User> principal = null;
    User u = null;
    List<User> ulist = User.dao.findBy("username=?", username);
    if (ulist.size() > 0) {
        u = ulist.get(0);
    }
    if (u != null) {
        principal = new Principal<User>(u.<String> get("username"),
                u.<String> get("password"), credentials, u);
    }
    // Principal<User> principal = new
    // Principal<User>(u.<String>get("username"), u.<String>get("password"),
    // "x", (Set) u.get("permissions"), u);
    return principal;
    

    }

    /**

    • 加载全部的权限信息
      *
    • @return 权限集合
      /
      public Set getAllCredentials() {
      Set credentials = new HashSet();
      credentials.add(new Credential("
      ", "/api/v1.0/users/", "users"));
      credentials.add(new Credential("*", "/api/v1.0/news/
      ", "news"));
      return credentials;
      }

    @post
    public User login(String username, String password, boolean rememberMe) {
    Subject.login(username, password, rememberMe);
    return (User) Subject.getPrincipal().getModel();
    }

    @delete
    public boolean logout() {
    Subject.logout();
    return true;
    }
    }

'''

QuartzPlugin启动报错:`org.quartz.SchedulerConfigException: Thread count must be > 0`

SEVERE:   WebModule[/isofoo_api]Exception starting filter RestyFilter
java.lang.InstantiationException
    at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:135)
    at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:5329)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:5974)
    at com.sun.enterprise.web.WebModule.start(WebModule.java:691)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:1041)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:1024)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:747)
    at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:2286)
    at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:1932)
    at com.sun.enterprise.web.WebApplication.start(WebApplication.java:139)
    at org.glassfish.internal.data.EngineRef.start(EngineRef.java:122)
    at org.glassfish.internal.data.ModuleInfo.start(ModuleInfo.java:291)
    at org.glassfish.internal.data.ApplicationInfo.start(ApplicationInfo.java:352)
    at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:500)
    at com.sun.enterprise.v3.server.ApplicationLoaderService.processApplication(ApplicationLoaderService.java:406)
    at com.sun.enterprise.v3.server.ApplicationLoaderService.postConstruct(ApplicationLoaderService.java:243)
    at org.jvnet.hk2.internal.ClazzCreator.postConstructMe(ClazzCreator.java:326)
    at org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:374)
    at org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:471)
    at org.glassfish.hk2.runlevel.internal.AsyncRunLevelContext.findOrCreate(AsyncRunLevelContext.java:228)
    at org.glassfish.hk2.runlevel.RunLevelContext.findOrCreate(RunLevelContext.java:85)
    at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2072)
    at org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:114)
    at org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:88)
    at org.glassfish.hk2.runlevel.internal.CurrentTaskFuture$QueueRunner.oneJob(CurrentTaskFuture.java:1213)
    at org.glassfish.hk2.runlevel.internal.CurrentTaskFuture$QueueRunner.run(CurrentTaskFuture.java:1144)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:722)
Caused by: javax.servlet.ServletException: Can't start quartz plugin.
    at cn.dreampie.route.RestyFilter.init(RestyFilter.java:46)
    at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:275)
    at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:131)
    ... 28 more
Caused by: cn.dreampie.quartz.exception.QuartzException: Can't start quartz plugin.
    at cn.dreampie.quartz.QuartzPlugin.start(QuartzPlugin.java:83)
    at cn.dreampie.route.ConfigIniter.startPlugins(ConfigIniter.java:56)
    at cn.dreampie.route.ConfigIniter.<init>(ConfigIniter.java:21)
    at cn.dreampie.route.RestyIniter.<init>(RestyIniter.java:24)
    at cn.dreampie.route.RestyFilter.init(RestyFilter.java:43)
    ... 30 more
Caused by: org.quartz.SchedulerConfigException: Thread count must be > 0
    at org.quartz.simpl.SimpleThreadPool.initialize(SimpleThreadPool.java:242)
    at org.quartz.impl.StdSchedulerFactory.instantiate(StdSchedulerFactory.java:1288)
    at org.quartz.impl.StdSchedulerFactory.getScheduler(StdSchedulerFactory.java:1519)
    at cn.dreampie.quartz.QuartzPlugin.start(QuartzPlugin.java:76)
    ... 34 more

动态创建的表,必须重启程序,才能对数据进行Save操作

创建表是用:
Record rdo = new Record();
rdo.execute("create table ......");

之后执行查询没问题,但一旦要执行record.Save就出问题了,提示“he attribute name is not exists: fieldname"
经过调试,发现有TableMeta,但其中的columns的size等于零,也就是没有取到字段!

看看是否能够在发现columns没内容时,自动重取TableMeta,或者把BuildTableMeta的方法提供出来,让我们在外面可以强制重新获取字段内容。

谢谢!

postgresql执行SQL错误,sql语句在mysql中正常,

CREATE SEQUENCE public.sec_user_id_seq
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 1
  CACHE 1;
ALTER TABLE public.sec_user_id_seq
  OWNER TO postgres;

CREATE TABLE public.sec_user
(
  id integer NOT NULL DEFAULT nextval('sec_user_id_seq'::regclass),
  sid integer NOT NULL,
  username character varying(50) NOT NULL,
  providername character varying(50) NOT NULL,
  email character varying(200),
  phone character varying(200),
  password character varying(200) NOT NULL,
  avatar_url character varying(255),
  first_name character varying(10),
  last_name character varying(10),
  full_name character varying(20),
  created_at timestamp without time zone NOT NULL,
  updated_at timestamp without time zone,
  deleted_at timestamp without time zone,
  CONSTRAINT sec_user_pkey PRIMARY KEY (id)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE public.sec_user
  OWNER TO postgres;

INSERT INTO sec_user(id,sid,username, providername, email, phone, password, avatar_url, first_name, last_name, full_name, created_at) VALUES (1,2,'admin','shengmu','[email protected]','18611434500','57827590596df8a8113116977059c7578d652b95ec123c23e89800ebbffd384e1eb17c8f8eb3d957784ad5ee54e1ff065cd3df0a491106940094bbc9adcd644b','','管理员','圣牧','圣牧.管理员',current_timestamp);
16-01-27 12:19:36.067 [qtp211031000-14] DEBUG druid.sql.Statement - {conn-10010, pstmt-20000} Parameters : [admin]
16-01-27 12:19:36.067 [qtp211031000-14] DEBUG druid.sql.Statement - {conn-10010, pstmt-20000} Types : [VARCHAR]
16-01-27 12:19:36.083 [qtp211031000-14] ERROR druid.sql.Statement - {conn-10010, pstmt-20000} execute error. SELECT * FROM sec_user WHERE username=? AND deleted_at IS NULL LIMIT 1 OFFSET 0
org.postgresql.util.PSQLException: 错误: 语法错误 在 "RETURNING" 或附近的
  位置:82
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2182) ~[postgresql-9.4.1207.jar:9.4.1207.jre7]
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1911) ~[postgresql-9.4.1207.jar:9.4.1207.jre7]
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:173) ~[postgresql-9.4.1207.jar:9.4.1207.jre7]
    at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:622) ~[postgresql-9.4.1207.jar:9.4.1207.jre7]
    at org.postgresql.jdbc.PgStatement.executeWithFlags(PgStatement.java:472) ~[postgresql-9.4.1207.jar:9.4.1207.jre7]
    at org.postgresql.jdbc.PgStatement.executeQuery(PgStatement.java:386) ~[postgresql-9.4.1207.jar:9.4.1207.jre7]
    at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_executeQuery(FilterChainImpl.java:2714) [druid-1.0.13.jar:1.0.13]
    at com.alibaba.druid.wall.WallFilter.preparedStatement_executeQuery(WallFilter.java:609) ~[druid-1.0.13.jar:1.0.13]
    at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_executeQuery(FilterChainImpl.java:2711) [druid-1.0.13.jar:1.0.13]
    at com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_executeQuery(FilterEventAdapter.java:465) ~[druid-1.0.13.jar:1.0.13]
    at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_executeQuery(FilterChainImpl.java:2711) [druid-1.0.13.jar:1.0.13]
    at com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_executeQuery(FilterEventAdapter.java:465) ~[druid-1.0.13.jar:1.0.13]
    at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_executeQuery(FilterChainImpl.java:2711) [druid-1.0.13.jar:1.0.13]
    at com.alibaba.druid.proxy.jdbc.PreparedStatementProxyImpl.executeQuery(PreparedStatementProxyImpl.java:132) [druid-1.0.13.jar:1.0.13]
    at com.alibaba.druid.pool.DruidPooledPreparedStatement.executeQuery(DruidPooledPreparedStatement.java:227) [druid-1.0.13.jar:1.0.13]
    at cn.dreampie.orm.Base.find(Base.java:512) [resty-orm-1.2.0-SNAPSHOT.jar:na]
    at cn.dreampie.orm.Base.findFirst(Base.java:539) [resty-orm-1.2.0-SNAPSHOT.jar:na]
    at cn.dreampie.orm.Base.findFirstBy(Base.java:1100) [resty-orm-1.2.0-SNAPSHOT.jar:na]
    at cn.dreampie.config.MyAuthenticateService.getPrincipal(MyAuthenticateService.java:29) [classes/:na]
    at cn.dreampie.security.credential.Credentials.getPrincipal(Credentials.java:138) [resty-security-1.2.0-SNAPSHOT.jar:na]
    at cn.dreampie.security.Subject.login(Subject.java:77) [resty-security-1.2.0-SNAPSHOT.jar:na]
    at cn.dreampie.security.Subject.login(Subject.java:132) [resty-security-1.2.0-SNAPSHOT.jar:na]
    at cn.dreampie.resource.SessionResource.login(SessionResource.java:36) [classes/:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_60]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_60]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_60]
    at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_60]
    at cn.dreampie.route.core.RouteInvocation.methodInvoke(RouteInvocation.java:95) [resty-route-1.2.0-SNAPSHOT.jar:na]
    at cn.dreampie.route.core.RouteInvocation.invoke(RouteInvocation.java:191) [resty-route-1.2.0-SNAPSHOT.jar:na]
    at cn.dreampie.route.interceptor.transaction.TransactionInterceptor.intercept(TransactionInterceptor.java:64) [resty-route-1.2.0-SNAPSHOT.jar:na]
    at cn.dreampie.route.core.RouteInvocation.methodInvoke(RouteInvocation.java:55) [resty-route-1.2.0-SNAPSHOT.jar:na]
    at cn.dreampie.route.core.RouteInvocation.invoke(RouteInvocation.java:191) [resty-route-1.2.0-SNAPSHOT.jar:na]
    at cn.dreampie.route.interceptor.security.SecurityInterceptor.intercept(SecurityInterceptor.java:37) [resty-route-1.2.0-SNAPSHOT.jar:na]
    at cn.dreampie.route.core.RouteInvocation.methodInvoke(RouteInvocation.java:55) [resty-route-1.2.0-SNAPSHOT.jar:na]
    at cn.dreampie.route.core.RouteInvocation.invoke(RouteInvocation.java:191) [resty-route-1.2.0-SNAPSHOT.jar:na]
    at cn.dreampie.route.cache.CacheInterceptor.intercept(CacheInterceptor.java:83) [resty-route-1.2.0-SNAPSHOT.jar:na]
    at cn.dreampie.route.core.RouteInvocation.methodInvoke(RouteInvocation.java:55) [resty-route-1.2.0-SNAPSHOT.jar:na]
    at cn.dreampie.route.core.RouteInvocation.invoke(RouteInvocation.java:191) [resty-route-1.2.0-SNAPSHOT.jar:na]
    at cn.dreampie.route.core.RouteHandler.handle(RouteHandler.java:67) [resty-route-1.2.0-SNAPSHOT.jar:na]
    at cn.dreampie.route.handler.cors.CORSHandler.handle(CORSHandler.java:102) [resty-route-1.2.0-SNAPSHOT.jar:na]
    at cn.dreampie.route.RestyFilter.doFilter(RestyFilter.java:82) [resty-route-1.2.0-SNAPSHOT.jar:na]
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) [jetty-servlet-9.3.0.M2.jar:9.3.0.M2]
    at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:123) [druid-1.0.13.jar:1.0.13]
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) [jetty-servlet-9.3.0.M2.jar:9.3.0.M2]
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:585) [jetty-servlet-9.3.0.M2.jar:9.3.0.M2]
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) [jetty-server-9.3.0.M2.jar:9.3.0.M2]
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:550) [jetty-security-9.3.0.M2.jar:9.3.0.M2]
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:223) [jetty-server-9.3.0.M2.jar:9.3.0.M2]
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1128) [jetty-server-9.3.0.M2.jar:9.3.0.M2]
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515) [jetty-servlet-9.3.0.M2.jar:9.3.0.M2]
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185) [jetty-server-9.3.0.M2.jar:9.3.0.M2]
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1062) [jetty-server-9.3.0.M2.jar:9.3.0.M2]
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) [jetty-server-9.3.0.M2.jar:9.3.0.M2]
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:215) [jetty-server-9.3.0.M2.jar:9.3.0.M2]
    at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:110) [jetty-server-9.3.0.M2.jar:9.3.0.M2]
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:113) [jetty-server-9.3.0.M2.jar:9.3.0.M2]
    at org.eclipse.jetty.server.Server.handle(Server.java:507) [jetty-server-9.3.0.M2.jar:9.3.0.M2]
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:284) [jetty-server-9.3.0.M2.jar:9.3.0.M2]
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:237) [jetty-server-9.3.0.M2.jar:9.3.0.M2]
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:240) [jetty-io-9.3.0.M2.jar:9.3.0.M2]
    at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:93) [jetty-io-9.3.0.M2.jar:9.3.0.M2]
    at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:53) [jetty-io-9.3.0.M2.jar:9.3.0.M2]
    at org.eclipse.jetty.util.thread.strategy.ExecuteProduceRun.produceAndRun(ExecuteProduceRun.java:191) [jetty-util-9.3.0.M2.jar:9.3.0.M2]
    at org.eclipse.jetty.util.thread.strategy.ExecuteProduceRun.run(ExecuteProduceRun.java:126) [jetty-util-9.3.0.M2.jar:9.3.0.M2]
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:641) [jetty-util-9.3.0.M2.jar:9.3.0.M2]
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:559) [jetty-util-9.3.0.M2.jar:9.3.0.M2]
    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_60]
16-01-27 12:19:36.083 [qtp211031000-14] DEBUG druid.sql.Statement - {conn-10010, pstmt-20000} clearParameters. 
16-01-27 12:19:36.083 [qtp211031000-14] DEBUG com.alibaba.druid.pool.PreparedStatementPool - {conn-10010, pstmt-20000} enter cache
16-01-27 12:19:36.083 [qtp211031000-14] DEBUG druid.sql.Connection - {conn-10010} pool-recycle
16-01-27 12:19:36.083 [qtp211031000-14] ERROR cn.dreampie.route.core.Route - Route method invoke error.
cn.dreampie.orm.exception.DBException: 错误: 语法错误 在 "RETURNING" 或附近的
  位置:82
    at cn.dreampie.orm.Base.find(Base.java:517) ~[resty-orm-1.2.0-SNAPSHOT.jar:na]
    at cn.dreampie.orm.Base.findFirst(Base.java:539) ~[resty-orm-1.2.0-SNAPSHOT.jar:na]
    at cn.dreampie.orm.Base.findFirstBy(Base.java:1100) ~[resty-orm-1.2.0-SNAPSHOT.jar:na]
    at cn.dreampie.config.MyAuthenticateService.getPrincipal(MyAuthenticateService.java:29) ~[classes/:na]
    at cn.dreampie.security.credential.Credentials.getPrincipal(Credentials.java:138) ~[resty-security-1.2.0-SNAPSHOT.jar:na]
    at cn.dreampie.security.Subject.login(Subject.java:77) ~[resty-security-1.2.0-SNAPSHOT.jar:na]
    at cn.dreampie.security.Subject.login(Subject.java:132) ~[resty-security-1.2.0-SNAPSHOT.jar:na]
    at cn.dreampie.resource.SessionResource.login(SessionResource.java:36) ~[classes/:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_60]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_60]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_60]
    at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_60]
    at cn.dreampie.route.core.RouteInvocation.methodInvoke(RouteInvocation.java:95) [resty-route-1.2.0-SNAPSHOT.jar:na]
    at cn.dreampie.route.core.RouteInvocation.invoke(RouteInvocation.java:191) [resty-route-1.2.0-SNAPSHOT.jar:na]
    at cn.dreampie.route.interceptor.transaction.TransactionInterceptor.intercept(TransactionInterceptor.java:64) [resty-route-1.2.0-SNAPSHOT.jar:na]
    at cn.dreampie.route.core.RouteInvocation.methodInvoke(RouteInvocation.java:55) [resty-route-1.2.0-SNAPSHOT.jar:na]
    at cn.dreampie.route.core.RouteInvocation.invoke(RouteInvocation.java:191) [resty-route-1.2.0-SNAPSHOT.jar:na]
    at cn.dreampie.route.interceptor.security.SecurityInterceptor.intercept(SecurityInterceptor.java:37) [resty-route-1.2.0-SNAPSHOT.jar:na]
    at cn.dreampie.route.core.RouteInvocation.methodInvoke(RouteInvocation.java:55) [resty-route-1.2.0-SNAPSHOT.jar:na]
    at cn.dreampie.route.core.RouteInvocation.invoke(RouteInvocation.java:191) [resty-route-1.2.0-SNAPSHOT.jar:na]
    at cn.dreampie.route.cache.CacheInterceptor.intercept(CacheInterceptor.java:83) [resty-route-1.2.0-SNAPSHOT.jar:na]
    at cn.dreampie.route.core.RouteInvocation.methodInvoke(RouteInvocation.java:55) [resty-route-1.2.0-SNAPSHOT.jar:na]
    at cn.dreampie.route.core.RouteInvocation.invoke(RouteInvocation.java:191) [resty-route-1.2.0-SNAPSHOT.jar:na]
    at cn.dreampie.route.core.RouteHandler.handle(RouteHandler.java:67) [resty-route-1.2.0-SNAPSHOT.jar:na]
    at cn.dreampie.route.handler.cors.CORSHandler.handle(CORSHandler.java:102) [resty-route-1.2.0-SNAPSHOT.jar:na]
    at cn.dreampie.route.RestyFilter.doFilter(RestyFilter.java:82) [resty-route-1.2.0-SNAPSHOT.jar:na]
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) [jetty-servlet-9.3.0.M2.jar:9.3.0.M2]
    at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:123) [druid-1.0.13.jar:1.0.13]
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) [jetty-servlet-9.3.0.M2.jar:9.3.0.M2]
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:585) [jetty-servlet-9.3.0.M2.jar:9.3.0.M2]
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) [jetty-server-9.3.0.M2.jar:9.3.0.M2]
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:550) [jetty-security-9.3.0.M2.jar:9.3.0.M2]
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:223) [jetty-server-9.3.0.M2.jar:9.3.0.M2]
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1128) [jetty-server-9.3.0.M2.jar:9.3.0.M2]
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515) [jetty-servlet-9.3.0.M2.jar:9.3.0.M2]
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185) [jetty-server-9.3.0.M2.jar:9.3.0.M2]
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1062) [jetty-server-9.3.0.M2.jar:9.3.0.M2]
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) [jetty-server-9.3.0.M2.jar:9.3.0.M2]
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:215) [jetty-server-9.3.0.M2.jar:9.3.0.M2]
    at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:110) [jetty-server-9.3.0.M2.jar:9.3.0.M2]
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:113) [jetty-server-9.3.0.M2.jar:9.3.0.M2]
    at org.eclipse.jetty.server.Server.handle(Server.java:507) [jetty-server-9.3.0.M2.jar:9.3.0.M2]
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:284) [jetty-server-9.3.0.M2.jar:9.3.0.M2]
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:237) [jetty-server-9.3.0.M2.jar:9.3.0.M2]
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:240) [jetty-io-9.3.0.M2.jar:9.3.0.M2]
    at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:93) [jetty-io-9.3.0.M2.jar:9.3.0.M2]
    at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:53) [jetty-io-9.3.0.M2.jar:9.3.0.M2]
    at org.eclipse.jetty.util.thread.strategy.ExecuteProduceRun.produceAndRun(ExecuteProduceRun.java:191) [jetty-util-9.3.0.M2.jar:9.3.0.M2]
    at org.eclipse.jetty.util.thread.strategy.ExecuteProduceRun.run(ExecuteProduceRun.java:126) [jetty-util-9.3.0.M2.jar:9.3.0.M2]
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:641) [jetty-util-9.3.0.M2.jar:9.3.0.M2]
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:559) [jetty-util-9.3.0.M2.jar:9.3.0.M2]
    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_60]
Caused by: org.postgresql.util.PSQLException: 错误: 语法错误 在 "RETURNING" 或附近的
  位置:82
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2182) ~[postgresql-9.4.1207.jar:9.4.1207.jre7]
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1911) ~[postgresql-9.4.1207.jar:9.4.1207.jre7]
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:173) ~[postgresql-9.4.1207.jar:9.4.1207.jre7]
    at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:622) ~[postgresql-9.4.1207.jar:9.4.1207.jre7]
    at org.postgresql.jdbc.PgStatement.executeWithFlags(PgStatement.java:472) ~[postgresql-9.4.1207.jar:9.4.1207.jre7]
    at org.postgresql.jdbc.PgStatement.executeQuery(PgStatement.java:386) ~[postgresql-9.4.1207.jar:9.4.1207.jre7]
    at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_executeQuery(FilterChainImpl.java:2714) ~[druid-1.0.13.jar:1.0.13]
    at com.alibaba.druid.wall.WallFilter.preparedStatement_executeQuery(WallFilter.java:609) ~[druid-1.0.13.jar:1.0.13]
    at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_executeQuery(FilterChainImpl.java:2711) ~[druid-1.0.13.jar:1.0.13]
    at com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_executeQuery(FilterEventAdapter.java:465) ~[druid-1.0.13.jar:1.0.13]
    at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_executeQuery(FilterChainImpl.java:2711) ~[druid-1.0.13.jar:1.0.13]
    at com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_executeQuery(FilterEventAdapter.java:465) ~[druid-1.0.13.jar:1.0.13]
    at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_executeQuery(FilterChainImpl.java:2711) ~[druid-1.0.13.jar:1.0.13]
    at com.alibaba.druid.proxy.jdbc.PreparedStatementProxyImpl.executeQuery(PreparedStatementProxyImpl.java:132) ~[druid-1.0.13.jar:1.0.13]
    at com.alibaba.druid.pool.DruidPooledPreparedStatement.executeQuery(DruidPooledPreparedStatement.java:227) ~[druid-1.0.13.jar:1.0.13]
    at cn.dreampie.orm.Base.find(Base.java:512) ~[resty-orm-1.2.0-SNAPSHOT.jar:na]
    ... 51 common frames omitted
16-01-27 12:19:36.083 [qtp211031000-14] WARN  cn.dreampie.route.holder.DefaultExceptionHolder - Request "POST /api/v1.2/sessions" error : 500 "错误: 语法错误 在 \"RETURNING\" 或附近的\n  位置:82"

mvn install error

mvn install 时候报以下错
mvn install error

[INFO]
[INFO] resty ............................................. SUCCESS [5.836s]
[INFO] resty-log ......................................... SUCCESS [1.939s]
[INFO] resty-cache ....................................... SUCCESS [0.433s]
[INFO] resty-common ...................................... SUCCESS [0.931s]
[INFO] resty-upload ...................................... SUCCESS [0.395s]
[INFO] resty-orm-sql ..................................... SUCCESS [0.719s]
[INFO] resty-security .................................... SUCCESS [0.419s]
[INFO] resty-route ....................................... SUCCESS [0.672s]
[INFO] resty-orm-nosql ................................... SUCCESS [0.250s]
[INFO] resty-client ...................................... SUCCESS [0.404s]
[INFO] resty-example ..................................... FAILURE [0.005s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 12.146s
[INFO] Finished at: Sun Jan 11 22:02:57 CST 2015
[INFO] Final Memory: 15M/81M
[INFO] ------------------------------------------------------------------------
[ERROR] Plugin org.apache.maven.plugins:maven-war-plugin:2.2 or one of its dependencies could not be resolved: Failed to read artifact descriptor for org.apache.maven.plugins:maven-war-plugin:jar:2.2: 1 problem was encountered while building the effective model
[ERROR] [FATAL] Non-parseable POM /Users/qk/.m2/repository/org/apache/maven/plugins/maven-war-plugin/2.2/maven-war-plugin-2.2.pom: end tag name must match start tag name from line 145 (position: TEXT seen ...\r\n... @146:8) @ line 146, column 8
[ERROR] -> [Help 1]

关于权限拦截及过滤器

登录后访问接口如何获取当前用户信息(Session?),用户访问接口时怎么判断登录信息是否失效进行权限拦截(只能在getAllCredentials?)?

上传文件的问题

我现在在做上传文件的功能,这时候我的前台数据用的form-data
后台按照介绍里那样设置好了,但是在测试接口时,显示不能使用form-data,请问我要怎么来上传呢,不能还用json吧?

批量上传图片出错

下面的路径是我修改过的版本ICEREST的,但是涉及到文件上传的部分没有经过修改

java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.WildcardTypeImpl cannot be cast to java.lang.Class
	at com.cybermkd.route.core.Route.parseFormParams(Route.java:546) ~[ICEREST-1.0.1.3.jar:na]
	at com.cybermkd.route.core.Route.match(Route.java:278) ~[ICEREST-1.0.1.3.jar:na]
	at com.cybermkd.route.core.RouteHandler.handle(RouteHandler.java:47) [ICEREST-1.0.1.3.jar:na]
	at com.cybermkd.route.handler.cors.CORSHandler.handle(CORSHandler.java:102) [ICEREST-1.0.1.3.jar:na]
	at com.cybermkd.route.IceFilter.doFilter(IceFilter.java:90) [ICEREST-1.0.1.3.jar:na]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) [catalina.jar:9.0.0.M9]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) [catalina.jar:9.0.0.M9]
	at com.cybermkd.filter.WafFilter.doFilter(WafFilter.java:44) [ICEREST-1.0.1.3.jar:na]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) [catalina.jar:9.0.0.M9]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) [catalina.jar:9.0.0.M9]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) [catalina.jar:9.0.0.M9]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:108) [catalina.jar:9.0.0.M9]
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:522) [catalina.jar:9.0.0.M9]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) [catalina.jar:9.0.0.M9]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) [catalina.jar:9.0.0.M9]
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620) [catalina.jar:9.0.0.M9]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) [catalina.jar:9.0.0.M9]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349) [catalina.jar:9.0.0.M9]
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:1110) [tomcat-coyote.jar:9.0.0.M9]
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-coyote.jar:9.0.0.M9]
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:785) [tomcat-coyote.jar:9.0.0.M9]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1425) [tomcat-coyote.jar:9.0.0.M9]
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-coyote.jar:9.0.0.M9]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_60]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_60]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-util.jar:9.0.0.M9]
	at java.lang.Thread.run(Thread.java:745) [na:1.8.0_60]

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.