卡桑德拉新手问题.我正在使用REST调用从社交网站收集一些数据.所以我最终以JSON格式返回数据.
JSON只是我表中的一列.我试图弄清楚存储JSON字符串的"最佳实践"是什么.
首先我考虑使用地图类型,但JSON包含字符串,数字类型等的混合.似乎我不能为地图键/值声明通配符类型.JSON字符串可能非常大,可能超过10KB.我可以将它存储为字符串,但似乎效率低下.我认为这是一项常见任务,因此我确信有一些关于如何执行此操作的一般指导原则.
我知道Cassandra本身支持JSON,但据我所知,当整个JSON映射与数据库模式匹配1-1时,主要使用它.对我来说情况并非如此.模式有一堆列,JSON字符串只是一种"有效负载".将JSON字符串存储为blob还是文本更好?顺便说一句,Cassandra版本是2.1.5.
任何提示赞赏.提前致谢.
我正在尝试为几个Spring Boot应用程序分配配置属性.我正在使用Spring Boot 1.1.6,我们的配置属性以通常的application.yml样式在YAML中表示.我已经为常见的基本参数,常见的数据库参数等创建了各种配置文件.我试图使用Spring Boot参考文档中提到的include功能,但它似乎可以作为覆盖而不是包含.与我想要的完全相反.鉴于application.yml中的以下内容,我希望当条形配置文件处于活动状态时,属性名称具有值栏,而是将其设置为foo(来自包含的配置文件).我认为包含的概念意味着它首先被加载,并且在新配置文件中设置的任何具有相同名称的属性将覆盖包含的配置文件中的属性.有点像子类正在从超类中遮蔽一个字段,子类的任何实例都会反映阴影值.这是文件:
spring:
profiles: foo
name: foo
--- # New YAML doc starts here
spring:
profiles:
include: foo
profiles: bar
name: bar
Run Code Online (Sandbox Code Playgroud)
如果我在显式激活"bar"配置文件的测试用例中运行它,那么name属性仍然是foo:
SpringApplicationBuilder builder = new SpringApplicationBuilder(Application.class);
SpringApplication app = builder.application();
builder.profiles("bar");
ConfigurableApplicationContext ctxt = app.run();
String name = ctxt.getEnvironment().getProperty("name"); // Is always "foo" much to my surprise
Run Code Online (Sandbox Code Playgroud)
但是,如果我评论出包括:
spring:
profiles: bar
# profiles:
# include: foo
Run Code Online (Sandbox Code Playgroud)
并在我的代码中显式激活两个配置文件:
builder.profiles("foo", "bar");
Run Code Online (Sandbox Code Playgroud)
然后它按照我的预期工作,并且name属性设置为bar.我宁愿在YAML文件中处理包含的主要原因是它对我的实际代码的影响较小,我可以在一个地方管理所有配置文件.使用另一种方法,如果我要重命名配置文件,我必须在整个项目中搜索配置文件字符串和可能的@Profile注释.这肯定更容易出错.我认为更灵活的解决方案是明确能够表达所包含的配置文件是否覆盖子配置文件值.也许是这样的:
spring: …Run Code Online (Sandbox Code Playgroud) 我在混合 Java/Groovy 环境中遇到编译顺序问题。我们使用 Gradle 2.1、JDK 7 和 Groovy 2.3。使用 Gradle 插件和相同的 build.gradle 文件,代码在 STS(Spring Tool Suite)中可以正常编译,但在命令行上运行构建时会失败。STS 配置为使用 Groovy Eclipse 插件,如果我理解正确的话,它使用它自己的编译器。所以我认为这个问题源于我们使用 Gradle 的 Groovy 插件中的 Groovy 编译器时的编译顺序问题。这是 Groovy 类:
@Component
@ToString(includeNames = true, includePackage = false)
class ManagedCloseableHttpClientFactory implements ClientHttpRequestFactory {
@Delegate
HttpComponentsClientHttpRequestFactory factory
...
}
Run Code Online (Sandbox Code Playgroud)
ClientHttpRequestFactory 是一个 Spring 接口,由 Spring 类 HttpComponentsClientHttpRequestFactory 实现。在系统的其他地方,我们有一个用 @Configuration 注释的 Java 类,其中使用 @Autowired 注入 ManagedCloseableHttpClientFactory。像这样:
@Configuration
public class FooConfiguration {
@Autowired
private ManagedCloseableHttpClientFactory httpClientFactory;
...
}
Run Code Online (Sandbox Code Playgroud)
从命令行运行构建时,我们收到以下错误消息:/Users/xyz/source/prj/common/build/tmp/compileGroovy/groovy-java-stubs/common/web/client/ManagedCloseableHttpClientFactory.java: 10:错误: ManagedCloseableHttpClientFactory 不是抽象的,并且不会覆盖 ClientHttpRequestFactory 中的抽象方法 createRequest(URI,HttpMethod)。如果我们将标有 …
在我的一个集成测试中,我似乎遇到了一个棘手的情况.我有一个基于Spring Boot/Spring MVC和Cassandra DB的REST服务器.我正在使用spring-data-cassandra jar文件来启用POJO通过CassandraTemplate通过CrudRepository实现插入到DB中.应用程序工作正常,我可以进行REST调用,框架正确地将我的表单数据转换为POJO并将数据插入到数据库中.到现在为止还挺好.
我要做的是编写一个执行整个堆栈的集成测试.显然我不想依赖外部数据库,所以我使用了cassandra-unit-spring中的EmbeddedCassandra 并通过Spock测试驱动它.我遇到的问题似乎与@ContextConfiguration批注中定义的SpringApplicationContextLoader和@TestExecutionListener批注中定义的CassandraUnitTestExecutionListener类之间的某种排序冲突有关.由于这是一个Spock测试,它需要SpringApplicationContextLoader类来自动启动Spring Boot服务器.但是,它在Cassandra服务器启动之前会这样做,这会导致集群/会话bean无法加载,因为它们显然会在创建时立即尝试联系服务器.我已经尝试了很多东西组合,我的头在旋转.我不得不求助于我认为非常难看的解决方案.我有一个setup()方法,它使用布尔值来确保上下文和Spring Boot应用程序只运行一次.我尝试将它放在一个setupSpec()方法中,该方法每个测试类只运行一次,但是没有用(有些问题22).如果我尝试@Autowire上下文,那么它会在CassandraServer启动之前注入.正如我所提到的,我尝试了很多不同的东西.
这个解决方案有效,但它让我感到困惑的是,我无法通过注释和DI以更优雅的方式工作.此外,@ Value注释字段不会被初始化,这就是为什么我不得不求助于在启动Tomcat之后通过环境获取服务器端口的原因.关于如何以"正确的方式"这样做的任何建议都是非常受欢迎的.谢谢.
@ActiveProfiles(profiles = ["test"])
@ContextConfiguration(loader = SpringApplicationContextLoader.class, classes = Application.class)
// @WebIntegrationTest("server.port:0") // Pick a random port for Tomcat
@EnableConfigurationProperties
@EmbeddedCassandra
@CassandraDataSet(value = ["cql/createUserMgmtKeySpace.cql", "cql/createUserMgmtTables.cql"], keyspace = "user_mgmt")
@TestExecutionListeners(listeners = [ CassandraUnitTestExecutionListener.class ]) //, DependencyInjectionTestExecutionListener.class ]) //, mergeMode = MergeMode.MERGE_WITH_DEFAULTS)
@Title("Integration test for the lineup ingestion REST server and the Cassandra DAOs.")
public class CassandraSpec extends Specification {
@Shared
ApplicationContext context
@Shared
CQLDataLoader cql
@Shared boolean initialized = …Run Code Online (Sandbox Code Playgroud) 我正在使用 Spring Data Cassandra 1.3.4.RELEASE 来保留我拥有的类的实例。该类是用 Groovy 编写的,但我认为这并不重要。我已经实现了一个 CrudRepository,我正在将一个 CassandraOperations 实例注入到 repo 实现类中。我可以成功插入、删除和执行大多数其他操作。但是,我遇到的一个场景会破坏我的测试用例。我的实体类看起来像这样:
@Table("foo")
class FooData {
@PrimaryKey("id")
long id
@Column("created")
long updated
@Column("name")
String name
@Column("user_data")
String userData
@Column("numbers")
List numberList = []
}
Run Code Online (Sandbox Code Playgroud)
在我的测试用例中,我碰巧在调用 CassandraOperations.insert(entity) 之前只设置了几个字段,例如 'id' 和 'updated',因此在插入时实体实例中的大多数字段为空。但是 numberList 字段不为空,它是一个空列表。在 insert() 之后,我直接调用 CassandraOperations.selectOneById(FooData.class, id)。我得到了一个 FooData 实例,并且在我保存它时初始化的字段填充了数据。但是,我在我的测试中检查内容相等性,但它失败了,因为空列表没有作为从 CassandraOperations.selectOneById() 返回的 POJO 中的空列表返回。它实际上是空的。我认为这可能是某种 Cassandra 优化。它似乎发生在实例化 POJO/实体的 CGLIB 代码中。这是一个众所周知的“