小编jge*_*man的帖子

REST复杂/复合/嵌套资源

我试图围绕解决基于REST的API中的概念的最佳方式.不包含其他资源的平面资源没有问题.我遇到麻烦的地方是复杂的资源.

例如,我有一本漫画书的资源.ComicBook上有如各种属性author,issue number,date,等.

漫画书也有一份1..n封面清单.这些封面是复杂的对象.它们包含大量关于封面的信息:艺术家,日期,甚至是封面的64位编码图像.

对于GETComicBook我可以回相声,和所有的封面,包括他们的base64'ed图像.获得一部漫画可能不是什么大不了的事.但是假设我正在构建一个客户端应用程序,希望在表格中列出系统中的所有漫画.
该表将包含ComicBook资源中的一些属性,但我们当然不希望显示表中的所有封面.返回1000本漫画书,每本漫画书都有多个封面,这将导致大量数据流过网络,在这种情况下,最终用户不需要这些数据.

我的直觉是制作Cover资源并ComicBook包含封面.所以现在Cover是一个URI.GET漫画书现在可以使用,而不是Cover我们为每个封面发回一个URI 的巨大资源,客户可以根据需要检索封面资源.

现在我在创建新漫画方面遇到了问题.当我创建一个时,我肯定想要创建至少一个封面Comic,事实上这可能是一个商业规则.
所以现在我卡住了,我要么强制客户端通过先提交给执行业务规则Cover,获得URI为盖,然后POST荷兰国际集团一个ComicBook与URI列表,或者我POSTComicBook需要在寻找不同的资源比它吐出出.传入的资源是POSTGET深拷贝,其中传出的GETs包含对依赖资源的引用.

Cover在任何情况下,资源可能都是必要的,因为我确信作为客户,我想在某些情况下解决覆盖方向问题.因此,无论依赖资源的大小如何,问题都以一般形式存在.一般来说,如何处理复杂的资源而不强迫客户只是"知道"这些资源是如何组成的?

api rest resources nested-resources

171
推荐指数
2
解决办法
5万
查看次数

如何在更大的Clojure程序中以实用的方式使用core.logic?

我无法绕过如何混合clojure和core.logic.

例如说我有以下问题:

我有一个附加分数的键值对列表:

(:foo "10" 2)
(:bar "20" 3)
(:baz "30" 7)
Run Code Online (Sandbox Code Playgroud)

我也有一张地图:

{:foo "10",
 :bar "42",
 :baz "30"}
Run Code Online (Sandbox Code Playgroud)

我想做的是,根据地图评估的分数列表返回分数列表.

使用核心逻辑我可以这样做:

(defrel score key value score)
(fact score :foo "10" 2)
(fact score :bar "20" 3)
(fact score :baz "30" 7)

(run* [q]
  (conde 
    ((score :foo "10" q))
    ((score :baz "30" q))))
Run Code Online (Sandbox Code Playgroud)

我得到了预期的结果:

(2 7)
Run Code Online (Sandbox Code Playgroud)

我的问题是我没有看到如何把它变成我可以在一个更大的程序中动态运行的东西.这意味着我将在不同的时间应用不同的地图和不同的约束.我想我可以通过编写一个接受映射并输出约束的函数来创建conde的参数,但是如何在一组临时事实的上下文中运行*evaluate?

我当然可以写一个函数来返回我想要的东西而不用core.logic,但这看起来不太优雅.也许我正在咆哮错误的树(我是Clojure和core.logic的新手),这根本不是一个约束问题.

所以我的问题是:

当你从直到运行时才知道的来源提取你的事实和约束时,你如何混合核心逻辑?

相关的,你如何在一个环境中这样做,你想在一个新的事实环境中评估一组约束?

clojure clojure-core.logic

6
推荐指数
1
解决办法
832
查看次数

statement.isClose()抛出IllegalAccess异常,因为语句是关闭的?

我有下面的代码.相当标准的东西.但是,我在if(!stmt.isClose())行上获得了非法访问异常......错误表明这是因为语句已关闭.这不是那个方法调用的重点吗?有没有人对此有所了解?

Connection conn = dataSource.getConnection();
conn.setAutoCommit(false);
Statement stmt = conn.createStatement();
try {
    stmt.executeUpdate(updateQuery1);
    stmt.executeUpdate(updateQuery2);
    stmt.executeUpdate(updateQuery3);
    conn.commit();
    try {
        if (!stmt.isClosed()) {
            stmt.close();
        }
        if (!conn.isClosed()) {
            conn.close();
        }
    } catch (Throwable ignored) {
} catch(Throwable ignored) {
}
Run Code Online (Sandbox Code Playgroud)

499285 java.lang.IllegalAccessError: org.apache.tomcat.dbcp.dbcp.DelegatingStatement.isClosed()Z 499286 at com.millennialmedia.enterprise.services.impl.CampaignUtilServiceImpl.resetExceptionCampaign(CampaignUtilServiceImpl.java:80) 499287 at com.millennialmedia.rest.services.CampaignUtilRESTService$1.process(CampaignUtilRESTService.java:55) 499288 at com.millennialmedia.rest.services.CampaignUtilRESTService$1.process(CampaignUtilRESTService.java:49) 499289 at com.millennialmedia.services.util.Processor.doProcess(Processor.java:98) 499290 at com.millennialmedia.rest.services.CampaignUtilRESTService.resetExceptionCampaign(CampaignUtilRESTService.java:49) 499291 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 499292 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 499293 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 499294 at java.lang.reflect.Method.invoke(Method.java:597) 499295 at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60) 499296 at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchPro 499297 at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75) 499298 at …

java database jdbc

1
推荐指数
1
解决办法
1657
查看次数