我在Java中有一個Socket-Server。該套接字將接收具有特定結構的json字符串。代碼設計:從套接字到自定義處理程序類的JSON
{
"command": "test",
"name": "Hallo Welt"
}
我不能改變這種結構。 「命令」的值將聲明內容的類型。
我收到從插座在此之後,我想調用不同的處理程序,處理這些不同的命令:
- 命令「測試」> TestHandler實現CommandHandler
- 命令「富」> FooHandler工具CommandHandler
如何將json轉換爲對象並將該對象綁定到特定處理程序?
這是我目前的做法: 我有一個名爲BaseCommand的模型類,它包含一個枚舉命令字段。
class BaseCommand {
public CommandType command;
}
class TestCommand extends BaseCommand {
public String name;
}
使用GSON我將JSON解析爲BaseCommand類。 之後我可以讀取命令類型。
我宣佈一個ENUM的命令類型映射到處理程序:
enum CommandType {
test(TestHandler.class),
foo(FooHandler.class);
public final Class<? extends CommandHandler> handlerClass;
public CommandTypes(Class<? extends CommandHandler> handlerClass) {
this.handlerClass = handlerClass;
}
}
我處理的是實現了這個接口:
public interface CommandHandler<T extends BaseCommand> {
void handle(T command);
}
現在我命令枚舉類型,並通過谷歌Guices MapBinder我可以讓Handler實例處理請求。 This works
// in class ...
private final Map<CommandType, CommandHandler> handlers;
@Inject ClassName(Map<CommandType, CommandHandler> handlers) {
this.handlers = handlers;
}
// in converter method
private void convert(String json) {
BaseCommand baseCommand = GSONHelper().fromJson(json, BaseCommand.class);
// How can I get the CommandModel?
// If the commandType is "test" how can I parse TestCommand automatically?
??? commandModel = GSONHelper().fromJson(json, ???);
handlers.get(baseCommand.command).handle(commandModel);
}
有沒有人知道我的問題的解決方案? 或者完全不同的方法呢?
最好的問候,邁克爾