我想要一个简单的Java(或Scala)休息客户端库,让我可以轻松地在JSON REST API上执行GET/PUT/POST/DELETE等,并以类型安全的方式将JSON响应反序列化为Java对象,例如
RestClient client = new RestClient("http://api.mycompany.com").withAuth(Auth.Basic, username, password);
// This basically deserializes the JSON response into a POJO
MyDocument[] result = client.get("/document?limit=10", MyDocument[].class);
MyFriend friend = client.post("/friend/Joe", body, MyFriend.class);
Run Code Online (Sandbox Code Playgroud)
基本上我希望通用签名是这样的,get()
例如
public <T> T get(String path, Class<T> responseClass)
,它会执行GET请求并将JSON响应反序列化为类型的POJOresponseClass
我确实找到了一个非常接近我想要的站点库的库,但它的范围受到严重限制,例如它不允许我做更多不常见的HTTP动词,如PUT/PATCH/DELETE,它无法设置标题或甚至是请求的正文.
我找到的另一个库有相反的问题 - 它无法进行basicauth,也没有为您将JSON序列化为对象.
我有一个两难选择在我的GAE的Java应用程序:我想写将由GAE后端处理一个servlet 和它也必须用Guice的依赖注入启动所有servlet的领域.我尝试了多种方法,但似乎没有人为我做这个伎俩.
我首先尝试在servlet中使用Sitebricks,但似乎这样做会导致GAE在查询后端URL时无法将类检测为合法的servlet:始终从后端返回404 Not Found.尽管如此,我确信该类使用Sitebricks注释正确注释,因为相同的URI路径与前端实例一起工作正常.
接下来,我尝试使用Guice Servlet Extension(参见此链接); 在我创建全局的类中Injector
,我使用了这个绑定:
return Guice.createInjector(..., new ServletModule() {
@Override
protected void configureServlets() {
serve("/backend/*").with(MyBackend.class);
}
}, ...);
Run Code Online (Sandbox Code Playgroud)
不幸的是,与Sitebricks发生的问题完全相同:我在后端返回404错误,但在前端没有.
最后一种可行的方法是配置servlet-mapping web.xml
; 传统的方法.这最终允许我的后端检测URI映射(随后是Google的Java GAE后端文档中写的内容:"后端与主应用程序版本共享web.xml中定义的servlet.").不幸的是,我无法利用Guice注射器使用这个程序,因此我非常不希望使用它web.xml
.
我甚至尝试结合第二种和第三种方法:同时使用Guice Servlet Extension和web.xml.这个错误从后端返回500错误,并出现此错误:
java.lang.InstantiationException: com.example.MyBackend
at java.lang.Class.newInstance0(Class.java:340)
at java.lang.Class.newInstance(Class.java:308)
at org.mortbay.jetty.servlet.Holder.newInstance(Holder.java:153)
at org.mortbay.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:428)
at org.mortbay.jetty.servlet.ServletHolder.getServlet(ServletHolder.java:339)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
at com.google.appengine.tools.development.BackendServersFilter.doRedirectedServerRequest(BackendServersFilter.java:292)
at com.google.appengine.tools.development.BackendServersFilter.doFilter(BackendServersFilter.java:106)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
at …
Run Code Online (Sandbox Code Playgroud) 我正在将Sitebricks与Guice一起使用以实现REST服务,并且我有一组这样的方法:
@Get
@At("/:version/har/mostRecentEntry/assertResponseTimeWithin")
public Reply<?> doSomething(@Named("version") int version, Request<String> request) {
// Validation logic for request parameters ...
// Extracting parameters (converting url params to domain area objects)
// Actual business logic
}
Run Code Online (Sandbox Code Playgroud)
这导致大量复制/粘贴代码。
我正在寻找从请求参数中分离常见的验证和提取数据逻辑的方法。也许我可以使用AOP来做到这一点,但是Sitebricks提供的方法也许更简单?