解決了我在創建this post中建議的ArgumentFactory聯編程序時遇到的問題。
我需要那麼什麼是創建一個只包含一個字段類型的Map<String, Object>
實施Arugment
接口從org.skife.jdbi.v2.tweak
所以我結束了以下
public class NotificationPayload implements Argument {
private Map<String, Object> payload;
@Override
public void apply(int i, PreparedStatement preparedStatement, StatementContext statementContext)
throws SQLException {
preparedStatement.setString(i, toString());
}
@Override
public String toString() {
return new JSONObject(payload).toString();
}
}
爲了使這一工作,我當然需要一個類實現它實現了org.skife.jdbi.v2.tweak.ArgumentFactory<T>
接口與我的新創建的類型工廠類,因此工廠最後成爲這樣的:
public class NotificationPayloadFactory implements ArgumentFactory<NotificationPayload> {
@Override
public boolean accepts(Class<?> expectedType, Object value, StatementContext ctx) {
return value instanceof NotificationPayload;
}
@Override
public Argument build(Class<?> expectedType, NotificationPayload value, StatementContext ctx) {
return value;
}
}
,當然最後也在Does JDBI accept UUID parameters?提到我不得不註冊我的工廠:
jdbi.registerArgumentFactory(new NotificationPayloadFactory());
我想只是一個工廠的Map<String, Object>
要做到這一點,但不能讓這件工作,並有對NPE的風險。
編輯
的原因,我重寫toString()
在NotificationPayload
是因爲我需要在JSON格式的一些地方,我需要一個String對象的有效載荷。但是,也可以將其刪除,然後在調用toString()
的preparedStatement.setString()
中使用new JSONObject(payload).toString()
。
然後將您的地圖轉換爲JSON對象,如您所說x)檢查[此答案](https://stackoverflow.com/questions/8360836/gson-is-there-an-easier-way-to-serialize- a-map?noredirect = 1&lq = 1) – Nathan
我不能那樣做Nathan,因爲我需要它作爲我需要的其他東西的Map。但無論如何感謝您的建議。 – TheLearner
如果你嘗試在一行中存儲'Map',它顯然沒有很好的設計......每個鍵/值應該被連續存儲到一個輔助表中,並鏈接到'Something.name'(或每行一行'name + playload_key')。從這個角度來看,迭代Map來創建每一行都很容易,但也很容易獲得行來構建地圖。不需要將Map解析爲某種格式化的'String' – AxelH