我使用的是最新的spring-data-mongodb(1.1.0.M2)和最新的Mongo Driver(2.9.0-RC1).我有一种情况,我有多个客户端连接到我的应用程序,我想在同一个Mongo服务器中给每个客户端自己的"架构/数据库".如果我直接使用驱动程序,这不是一项非常困难的任务:
Mongo mongo = new Mongo( new DBAddress( "localhost", 127017 ) );
DB client1DB = mongo.getDB( "client1" );
DBCollection client1TTestCollection = client1DB.getCollection( "test" );
long client1TestCollectionCount = client1TTestCollection.count();
DB client2DB = mongo.getDB( "client2" );
DBCollection client2TTestCollection = client2DB.getCollection( "test" );
long client2TestCollectionCount = client2TTestCollection.count();
Run Code Online (Sandbox Code Playgroud)
看,很容易.但是spring-data-mongodb不允许使用多个数据库的简单方法.设置连接的首选方法Mongo是扩展AbstractMongoConfiguration类:
您将看到重写以下方法:
getDatabaseName()
Run Code Online (Sandbox Code Playgroud)
因此它强制您使用一个数据库名称.然后构建的存储库接口使用传递给SimpleMongoRepository类的MongoTemplate中的数据库名称.
我到底在哪里粘贴多个数据库名称?我必须创建多个数据库名称,多个MongoTempates(每个数据库名称一个)和多个其他配置类.而且仍然没有让我的存储库接口使用正确的模板.如果有人尝试过这样的事情,请告诉我.如果我搞清楚,我会在这里发布答案.
谢谢.
Hibernate Projection别名甚至可以工作吗?我发誓它不会发誓.至少,它没有做我期望它做的事情.
这是java:
return sessionFactory.getCurrentSession()
.createCriteria(PersonProgramActivity.class)
.setProjection(Projections.projectionList()
.add(Projections.alias(Projections.sum("numberOfPoints"), "number_of_points"))
.add(Projections.groupProperty("person.id")))
.setFirstResult(start)
.setFetchSize(size)
.addOrder(Order.desc("numberOfPoints"))
.list();
Run Code Online (Sandbox Code Playgroud)
这是它生成的SQL:
select
sum(this_.number_of_points) as y0_,
this_.person_id as y1_
from
PERSON_PROGRAM_ACTIVITY this_
group by
this_.person_id
order by
this_.number_of_points desc
Run Code Online (Sandbox Code Playgroud)
它似乎根本不使用别名.我想设置别名意味着sum(this_.number_of_points)将别名为number_of_points,而不是y0_.我缺少一些技巧吗?
谢谢.
我有一个java bean用于向弹簧发送JSON消息@RestController,我有bean验证设置并运行正常使用@Valid.但我想转向Protobuf/Thrift并远离REST.它是一个内部API,许多大公司已经在内部废除了REST.这真正意味着我不再控制消息对象 - 它们是在外部生成的.我不能再给它们加注释了.
所以现在我的验证必须是程序化的.我该怎么做呢?我编写了一个Validator,它的功能非常好.但它没有使用漂亮的@Valid注释.我必须做以下事情:
@Service
public StuffEndpoint implements StuffThriftDef.Iface {
@Autowired
private MyValidator myValidator;
public void things(MyMessage msg) throws BindException {
BindingResult errors = new BeanPropertyBindingResult(msg, msg.getClass().getName());
errors = myValidator.validate(msg);
if (errors.hasErrors()) {
throw new BindException(errors);
} else {
doRealWork();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这很臭.我必须在每一种方法中都这样做.现在,我可以将很多内容放入一个抛出的方法中BindException,这样就可以将一行代码添加到每个方法中.但那仍然不是很好.
我想要的是看起来像这样:
@Service
@Validated
public StuffEndpoint implements StuffThriftDef.Iface {
public void things(@Valid MyMessage msg) {
doRealWork();
}
}
Run Code Online (Sandbox Code Playgroud)
并且仍然得到相同的结果.记住,我的bean没有注释.是的,我知道我可以@InitBinder在方法上使用注释.但这仅适用于Web请求.
我不介意将正确的Validator注入到这个类中,但我更喜欢我的ValidatorFactory可以根据supports()方法提取正确的一个. …
我在 SpringMVC 应用程序中使用 MappingJacksonJsonView 从我的控制器呈现 JSON。我希望对象中的 ObjectId 呈现为 .toString ,但它会将 ObjectId 序列化为其部分。它在我的 Velocity/JSP 页面中运行良好:
Velocity:
$thing.id
Produces:
4f1d77bb3a13870ff0783c25
Json:
<script type="text/javascript">
$.ajax({
type: 'GET',
url: '/things/show/4f1d77bb3a13870ff0783c25',
dataType: 'json',
success : function(data) {
alert(data);
}
});
</script>
Produces:
thing: {id:{time:1327331259000, new:false, machine:974358287, timeSecond:1327331259, inc:-260555739},…}
id: {time:1327331259000, new:false, machine:974358287, timeSecond:1327331259, inc:-260555739}
inc: -260555739
machine: 974358287
new: false
time: 1327331259000
timeSecond: 1327331259
name: "Stack Overflow"
XML:
<script type="text/javascript">
$.ajax({
type: 'GET',
url: '/things/show/4f1d77bb3a13870ff0783c25',
dataType: 'xml',
success : function(data) {
alert(data);
}
});
</script> …Run Code Online (Sandbox Code Playgroud) 我的 Mac 上有最新的 (13.0.1) OpenJDK,但它似乎不包括 Shenandoah。我疯了吗?我知道已经发货了 它可以在我的 Linux 机器上运行。有不同的下载吗?不同的旗帜?
~ $ java -XX:+UnlockExperimentalVMOptions -XX:+PrintCommandLineFlags -version
-XX:G1ConcRefinementThreads=4 -XX:GCDrainStackTargetSize=64 -XX:InitialHeapSize=134217728
-XX:MaxHeapSize=2147483648 -XX:MinHeapSize=6815736 -XX:+PrintCommandLineFlags
-XX:ReservedCodeCacheSize=251658240 -XX:+SegmentedCodeCache -XX:+UnlockExperimentalVMOptions
-XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseG1GC
openjdk version "13.0.1" 2019-10-15
OpenJDK Runtime Environment (build 13.0.1+9)
OpenJDK 64-Bit Server VM (build 13.0.1+9, mixed mode, sharing)
Run Code Online (Sandbox Code Playgroud)
~ $ java -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+PrintCommandLineFlags -version
Error occurred during initialization of VM
Option -XX:+UseShenandoahGC not supported
Run Code Online (Sandbox Code Playgroud) java ×5
spring ×3
mongodb ×2
hibernate ×1
jackson ×1
java-13 ×1
json ×1
macos ×1
shenandoah ×1
spring-data ×1
validation ×1