gpt4 book ai didi

java - 在java中访问父类中的子常量

转载 作者:行者123 更新时间:2023-12-01 09:39:29 26 4
gpt4 key购买 nike

好的,我有一个有趣的问题。我正在使用 java/maven/spring-boot/cassandra...并且我正在尝试创建他们使用的 Mapper 设置的动态实例。即:

//Users.java
import com.datastax.driver.mapping.annotations.Table;

@Table(keyspace="mykeyspace", name="users")
public class Users {
@PartitionKey
public UUID id;
//...
}

现在,为了使用它,我必须明确地说...

Users user = (DB).mapper(Users.class);

显然用我的数据库类替换(DB)。这是一个很棒的模型,但我遇到了代码重复的问题。我的 Cassandra 数据库有 2 个键空间,两个键空间都有完全相同的表,表中的列也完全相同(这不是我的选择,根据我的公司,这是绝对必须有的)。因此,当我需要基于表单提交访问其中一个或另一个时,它会变成一堆重复的代码,例如:

//myWebController.java
import ...;

@RestController
public class MyRestController {

@RequestMapping(value="/orders", method=RequestMethod.POST)
public string getOrders(...) {
if(Objects.equals(client, "first_client_name") {
//do all the things to get first keyspace objects like....
FirstClientUsers users = (db).Mapper(FirstClientUsers.class);
//...
} else if(Objects.equals(client, "second_client_name") {
SecondClientUsers users = (db).Mapper(SecondClientUsers.class);
//....
}
return "";
}

我一直在尝试使用诸如...之类的方法

Class cls = Class.forName(STRING_INPUT_VARIABLE_HERE);

这对于基类来说工作正常,但是当尝试使用访问器时,它不再工作,因为访问器必须是接口(interface),所以当你执行 Class cls 时,它不再是一个接口(interface)。

我正在尝试寻找任何其他解决方案来动态地完成这项工作,而不必为每个可能的客户端提供重复的代码。每个客户端都将在 Cassandra 中拥有自己的命名空间,并具有与所有其他客户端完全相同的表。

我无法更改数据库模型,根据公司的说法,这是必须的。使用 PHP,这非常简单,因为它不太关心类型转换,我可以轻松地做到...

function getData($name) {
$className = $name . 'Accessor';
$class = new $className();
}

我有一个动态类,但我遇到的问题是类型规范,我必须明确地说...

FirstClientUsers users = new FirstClientUsers();
//or even
FirstClientUsers users = Class.forName("FirstClientUsers");

我希望这是有道理的,我无法想象我是第一个遇到这个问题的人,但我在网上找不到任何解决方案。因此,我真的希望有人知道如何在不为我们拥有的每个键空间重复完全相同的逻辑的情况下完成此任务。它使代码不可维护并且不必要地冗长。

预先感谢您提供的任何帮助。

最佳答案

不要在模型类中指定键空间,而是使用所谓的“每个键空间 session ”模式。

您的模型类将如下所示(请注意,键空间未定义):

@Table(name = "users")
public class Users {
@PartitionKey
public UUID id;
//...
}

你的初始化代码应该是这样的:

Map<String, Mapper<Users>> mappers = new ConcurrentHashMap<String, Mapper<Users>>();

Cluster cluster = ...;

Session firstClientSession = cluster.connect("keyspace_first_client");
Session secondClientSession = cluster.connect("keyspace_second_client");

MappingManager firstClientManager = new MappingManager(firstClientSession);
MappingManager secondClientManager = new MappingManager(secondClientSession);

mappers.put("first_client", firstClientManager.mapper(Users.class));
mappers.put("second_client", secondClientManager.mapper(Users.class));

// etc. for all clients

然后,您将存储 mappers 对象,并通过依赖项注入(inject)将其提供给应用程序中的其他组件。

最后,您的 REST 服务将如下所示:

import ...

@RestController
public class MyRestController {

@javax.inject.Inject
private Map<String, Mapper<Users>> mappers;

@RequestMapping(value = "/orders", method = RequestMethod.POST)
public string getOrders(...) {
Mapper<Users> usersMapper = getUsersMapperForClient(client);
// process the request with the right client's mapper
}

private Mapper<Users> getUsersMapperForClient(String client) {
if (mappers.containsKey(client))
return mappers.get(client);
throw new RuntimeException("Unknown client: " + client);
}
}

注意mappers对象是如何注入(inject)的。

小问题:我会将您的类命名为单数 User,而不是 Users(复数)。

关于java - 在java中访问父类中的子常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38575241/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com