假设我有一个资源,在调用delete时可以有两种不同的行为
如何以REST兼容的方式对其进行建模?
我想到了以下解决方案:
DELETE /myresource
Run Code Online (Sandbox Code Playgroud)
将资源移动到回收站(默认行为)
DELETE /myresource?force-delete=true
Run Code Online (Sandbox Code Playgroud)
强制删除资源.
这是否符合REST标准?我在调用DELETE时从未在URL中看到过查询参数,是吗?
我需要从非bean对象获取spring应用程序上下文.在SO中的另一个线程中,接受的答案建议使用单例来获取应用程序上下文. 获取Spring应用程序上下文
但是使用单例使得我的代码更加耦合并且不太可测试,许多线程中讨论的常见问题(例如单身人士的坏事)
问题是,有一种优雅的方法从非bean对象获取应用程序上下文而不使用单例吗?
我刚刚安装了PMD来分析我的Java项目.非常好的工具,强烈推荐.无论如何,我有一些错误说:
"抽象类中的空方法应该是抽象的"
我检查了PMD文档,解释说:
因为开发人员可能依赖于这个空实现而不是编写适当的实现
所以我想我理解这个代码样式错误背后的原因,但请考虑以下场景:我有一个名为Entity的抽象类.该类具有默认实现的布尔方法.(控制是否在删除时删除其相关实体).只有少数派生类将此默认行为覆盖为true.
我应该删除默认实现并强制所有派生类声明其行为吗?你真的认为这种模式是一种不好的做法吗?
澄清: PMD将单个return语句的方法视为空.
考虑以下http请求:
GET /defects?group-by=priority
Run Code Online (Sandbox Code Playgroud)
我希望将返回的缺陷集合(feed)按其优先级进行分组.即退回的饲料包括缺陷(资源)和群体信息.
我想到了一些能够在返回集合之前返回组的标题和数量的东西,例如:
<content>
<Group val="High" count="567"/>
<Group val="Medium" count="437"/>
<Group val="Low" count="19"/>
<Defect ,,,,>
<Defect ,,,,>
<Defect ,,,,>
</content>
Run Code Online (Sandbox Code Playgroud)
这种表示的问题在于查询的资源(URL)是缺陷的,因此客户端期望收集缺陷而不是Group元素.
我想解决这个问题的一个选择是为缺陷定义一个单独的组资源,即:
defects/groups?group1=priority
Run Code Online (Sandbox Code Playgroud)
这将返回组的集合及其计数,然后客户端可以查询数据本身的缺陷资源.但是这种设计很麻烦并且需要额外的往返,更不用说在调用组资源和缺陷资源之间添加缺陷时可能出现的一致性问题.
最重要的是,返回按属性分组的元素集合的其他方法是什么?
编辑我首先想到这个问题应该由ATOM出版标准来解决.但即使ATOM已经解决了它,我仍然需要支持其他表示(XML,JSON),所以我正在寻找RESTful方法中更固有的模式.
在我读完这篇文章后,这个问题在我脑海中 浮现:"常见的REST错误:会话无关紧要"
如果在RESTful应用程序中确实不鼓励会话.您将如何处理此类申请中的许可证.我特指的是并发许可证模型,而不是命名许可证.即客户购买X许可证,这意味着应用程序可以允许最多X个用户同时登录.这意味着应用程序必须为当前登录的用户保持状态.
我知道我可以创建一个名为licenses的资源,它将设置一个cookie或生成一个唯一的ID,然后客户端必须在每次请求时发送它.但它与创建会话相同,对吧?
如果我采用无状态方法并要求客户端为每个请求创建一个身份验证令牌,应用程序将如何知道何时为该客户端使用和释放许可证?
还有其他选择吗?特别是一个更RESTful的替代品?
kotlin 中有没有办法让 enum 类扩展 Jooq 的EnumType
?
我收到一个编译错误,因为 EnumType 有一个抽象的 getName 方法,Kotlin 枚举类也是如此。
Error:(96, 5) Kotlin: Inherited platform declarations clash: The following declarations have the same JVM signature (getName()Ljava/lang/String;):
fun <get-name>(): String defined in com.xyz.MyEnum.Val1
fun getName(): String defined in com.xyz.MyEnum.Val1
Run Code Online (Sandbox Code Playgroud)
如果我使用常规 Kotlin 类而不是 enum 类,则 Jooq 失败并显示错误:
Error while looking up Scala enum
ClassNotFoundException ...
Run Code Online (Sandbox Code Playgroud)
Jooq + Kotlin + Postgresql 枚举可以很好地发挥作用吗?
您如何看待Web开发的未来?HTML,CSS和Ajax将继续引领网络开发还是你看到向富互联网应用程序(flex,silverlight和JavaFX)的转变?
我不是在寻找一个明确的答案,我知道你们是程序员而不是先知,但是如何看待当前网络发展趋势的智能分析将会受到赞赏.在网上进行此类辩论的链接也是最受欢迎的.
我问这个问题,因为我们现在正在评估完全重写GUI的技术.由于它是一个相对较大(实际上是巨大的)产品,我们倾向于做得很慢.我们需要考虑我们在哪里看到网络.
我对不久的将来感兴趣(从现在起3 - 5年).
我试图在REST中模拟实体的附件.假设缺陷实体可以附加多个附件.每个附件都有一个描述和一些其他属性(最后修改,文件大小......).附件本身是任何格式的文件(jpeg,doc ...)
我想知道我应该如何对REST进行建模
我想到了以下两个选项:
GET,content-type:http:// my-app/defects / {id}/attachments上的XML将以XML格式返回缺陷的附件元数据(描述,最后修改,文件大小......)
GET,内容类型:http:// my-app/defects / {id}/attachments上的gzip 将在zip文件中返回缺陷的附件
GET,content-type:mime multi-part on http:// my-app/defects / {id}/attachments将返回多部分消息中的缺陷附件(二进制数据和XML元数据)
POST,content-type:http:// my-app/defects / {id}/attachments上的XML 将创建新附件,元数据只附加文件(然后用户必须发送带有二进制数据的PUT请求)
POST,content-type:mime\multi-part on http:// my-app/defects / {id}/attachments将创建附件,客户端可以在单个往返中发送元数据和文件本身
GET,content-type:http:// my-app/defects / {id}/attachments上的XML将以XML格式返回缺陷的附件元数据(描述,最后修改,文件大小......)
GET,内容类型:http:// my-app/defects / {id}/attachments/files上的gzip 将在单个zip中返回缺陷的附件二进制数据
创建新附件,首先调用:
然后添加二进制数据本身:
一方面,第一种方法更加健壮和高效,因为客户端可以在单次往返中创建\获取附件元数据和二进制数据.另一方面,我有点不愿意使用mime-multipart表示,因为它消耗和生产更麻烦.
编辑:我检查了闪烁上传REST API.他们似乎正在使用多部分消息来包含照片和照片属性.
从JBoss 4升级到JBoss 5之后,我注意到了最烦人的回归.它截断了base64 cookie值的尾随等号('=').
我花了很多时间才明白问题不是我的代码而是JBoss',我用Google搜索并发现它是一个已知问题.
建议的解决方法是计算字符串长度并用尾随等号填充它(长度为4的多重性).
由于我们的应用程序可以在多个应用程序服务器(例如WebLogic,WebSpehere)上运行,因此我非常不愿意添加特定于此版本JBoss的这段代码.
有没有人遇到过这个?你能建议一个更聪明的解决方法吗?
编辑:感谢@skaffman我理解我的问题,我不应该首先使用base64作为cookie字符串.base 64上有一个名为base64 url的变种,应该用于这样的字符串(cookies,urls ......).例如,Apache编解码器库在其基本64实现中支持此变体.
我试图用mockito 模拟JDBI 的Query类,但它无法模拟其基类的方法SqlStatement
.
当运行下面的代码时,when语句实际上是在基类中调用具体实现而失败了NullPointerException
.
import java.util.Map;
import org.junit.Test;
import org.skife.jdbi.v2.Query;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public class TestClass {
@Test
public void testBind() {
Query<Map<String,Object>> mockQuery = mock(Query.class);
when(mockQuery.bind("xxx", 5)).thenReturn(mockQuery); //this line fails
//more stuff here
}
}
Run Code Online (Sandbox Code Playgroud)
我也尝试过使用EasyMock并获得相同的结果,它无法模拟这种方法.
更多信息:
例外是:
java.lang.NullPointerException
at org.skife.jdbi.v2.SQLStatement.bind(SQLStatement.java:434)
at TestClass.testBind(TestClass.java:17)
at ....
Run Code Online (Sandbox Code Playgroud)
任何想法如何解决这个问题?
rest ×4
java ×2
attachment ×1
base64 ×1
binary ×1
binaryfiles ×1
html ×1
java-ee ×1
jboss ×1
jboss5.x ×1
jdbi ×1
jooq ×1
kotlin ×1
licensing ×1
mockito ×1
postgresql ×1
ria ×1
singleton ×1
spring ×1
web-services ×1