我已经使用Jersey工作了几天的REST Web服务,并设法让所有CRUD操作工作,有几种交换格式:XML,JSON,Google Protobuf.
但是,我面临一些与自动生成的WADL和XSD相关的问题.
为了定义以这三种格式交换的对象,我遵循了"契约优先"的方法:
但是,由于我希望我的用户也能够生成他们的类,我想分享这些模式文件(.xsd和.proto)并将它们与自动生成的WADL很好地集成.
为此,感谢这个维基页面:
/schema/schema.xsd/schema/schema.proto我添加了一个应用程序语法文件:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<grammars xmlns="http://wadl.dev.java.net/2009/02"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xi="http://www.w3.org/1999/XML/xinclude">
<include href="../schema/schema.xsd" />
</grammars>
Run Code Online (Sandbox Code Playgroud)我添加了一个自定义的WADL生成器:
public class RichWadlGeneratorConfig extends WadlGeneratorConfig {
@Override
public List<WadlGeneratorDescription> configure() {
return generator(WadlGeneratorApplicationDoc.class)
.prop("applicationDocsStream", "application-doc.xml")
.generator(WadlGeneratorGrammarsSupport.class)
.prop("grammarsStream", "application-grammars.xml")
.descriptions();
}
}
Run Code Online (Sandbox Code Playgroud)这样,当我点击时,下面出现在WADL中/rest/application.wadl:
<grammars>
<include href="../schema/schema.xsd"/>
<include href="application.wadl/xsd0.xsd">
<doc title="Generated" xml:lang="en"/>
</include>
</grammars>
Run Code Online (Sandbox Code Playgroud)
/rest/application.wadl/xsd0.xsd是从我的课程自动生成的,但与我最初的课程有很大的不同schema.xsd.除此之外,调用像wadl2java这个WADL 这样的工具失败了,大概是因为
/schema/schema.xsd …对于将数据保存到nosql数据存储的代码,编写单元测试的最佳方法是什么,在我们的例子中是cassandra?
=>我们使用嵌入式服务器方法使用来自git hub的实用程序(https://github.com/hector-client/hector/blob/master/test/src/main/java/me/prettyprint/hector/testutils/EmbeddedServerHelper .java).但是我一直在看这个问题.1)它将数据保存在多个测试用例中,这使得我们很难确保测试类的测试用例中的数据不同.我尝试在每个测试用例之后调用cleanUp @Ahech,但这似乎并没有清理数据.2)当我们添加更多测试时,我们的内存不足,这可能是因为1,但我还不确定.我目前有1G堆大小来运行我的构建.
=>我一直在想的另一种方法是模拟cassandra存储.但这可能会泄漏cassandra模式中的一些问题,因为我们经常发现上述方法可以解决数据存储到cassandra中的问题.
请让我知道你对此的想法,如果有人使用过EmbeddedServerHelper并且熟悉我提到的问题.
只是一个更新.通过在测试嵌入式服务器使用的cassandra.yaml中将in_memory_compaction_limit_in_mb参数更改为32,我能够解决2)运行构建时用尽java堆空间问题.以下链接帮助我http://www.datastax.com/docs/0.7/configuration/storage_configuration#in-memory-compaction-limit-in-mb.它是64并且在压实期间始终失败.
我目前正在尝试使用Spring创建的内存中HSQLDB实例来创建测试环境,这得益于其嵌入式数据库支持:
为我的单元测试创建"数据源":
Run Code Online (Sandbox Code Playgroud)db = new EmbeddedDatabaseBuilder() .addDefaultScripts() .addScript("stored_procedure.sql") .build();
"stored_procedure.sql"的内容:
Run Code Online (Sandbox Code Playgroud)-- Mock of a more complex stored procedure in production environment CREATE PROCEDURE GetFooById(IN fooId VARCHAR(12)) READS SQL DATA DYNAMIC RESULT SETS 1 BEGIN ATOMIC DECLARE resultSet CURSOR WITHOUT HOLD WITH RETURN FOR SELECT name, value FROM Foos WHERE id = fooId; OPEN resultSet; END
我可以初始化我的架构并从"默认脚本"插入我的测试数据,没有任何问题.
但是,在创建过程时,我发现下面的错误,即使在上面的SQL的不同版本之后,有/没有分隔符,并且在不同的位置有分隔符:
Run Code Online (Sandbox Code Playgroud)java.sql.SQLSyntaxErrorException: unexpected end of statement: required: ; at org.hsqldb.jdbc.Util.sqlException(Unknown Source) at org.hsqldb.jdbc.Util.sqlException(Unknown Source) at org.hsqldb.jdbc.JDBCStatement.fetchResult(Unknown Source) at org.hsqldb.jdbc.JDBCStatement.executeUpdate(Unknown Source) at org.springframework.jdbc.datasource.init.ResourceDatabasePopulator.executeSqlScript(ResourceDatabasePopulator.java:169) …
随着越来越多的人对Scala感兴趣(比如我自己),而不是一个问题,我想讨论一个基于Lift的webapp登录/注销片段的实现.
我刚开始学习Scala和Lift,所以它可能不是实现这样一个功能的最佳方式,但我想与其他初学者分享,并与更有经验的开发人员讨论.请注意,我也不是Web开发方面的专家.任何改进的帮助将不胜感激(特别是性能和安全相关的);-)
1)首先,代码片段需要很容易插入,就像默认模板中的1行代码一样.我已经使用嵌入式 Lift功能完成了它(注意下划线,因此它不能呈现为页面本身,而只是从呈现的页面调用,简而言之,某种"私有"代码段):
<lift:embed what="_logInForm" />
Run Code Online (Sandbox Code Playgroud)
2)然后,在_logInForm.html中,我使用下面的标记和条件显示来处理所有事情:
<div>
<!-- User is not logged in, show a form to log in using the method loggedOut -->
<lift:LogInForm.loggedOut>
<form class="lift:LogInForm.logIn?form=post">
<label for="textName">Username: </label><input type="text" id="textName" name="name" /> <span class="lift:Msg?id=name;errorClass=error"/><br/>
<label for="textPassword">Password: </label><input type="password" id="textPassword" name="password" /> <span class="lift:Msg?id=password;errorClass=error"/><br/>
<input type="submit" value="Log in" />
</form>
</lift:LogInForm.loggedOut>
<!-- User is logged in, show who she is and a way to log out …Run Code Online (Sandbox Code Playgroud)