Я не уверен, что вы пытаетесь достичь в своем методе
public <T> void run(T x){ // Gets an unbounded T which means it can accept anything under Object.
if(x instanceof HashMap){
((HashMap<String,String>)x).put("foo","bar"); // How are you so sure it is an HashMap<String,String>? It can be any HashMap,or even Object!! That is exactly why your compiler is telling it is doing an unchecked cast.
}
}
Это отвечает вашему первому пункту.
Второй момент, нам нужно больше ясности в этом, чтобы объяснить.
Третий момент. В Java есть нечто, называемое стирание типа, когда универсальный метод не может знать тип объекта во время выполнения. Вы можете перейти в класс для чтения или использовать ограниченные символы для проверки во время компиляции.
Если это всего лишь небольшая (читай: один элемент) конфигурационная опция, возможно, будет проще пропустить какой-нибудь файл свойств. Если есть некоторое количество параметров конфигурации, и некоторые из них должны быть динамическими, я бы посоветовал сделать то, что делает плагин Acegi Security - возможно, добавить файл в /grails-app/conf/plugin_name_config.groovy.
Дополнительным преимуществом является то, что пользователь может выполнять отличный код для вычисления своих параметров конфигурации (намного лучше, чем использование файлов свойств), а также возможность легко создавать различные среды.
ознакомьтесь с http://groovy.codehaus.org/ConfigSlurper , это то, что внутри Grails используют для перехвата конфигов вроде config.groovy.
//e.g. in /grails-app/conf/MyWebServicePluginConfig.groovy
somePluginName {
production {
property1 = "some string"
}
test {
property1 = "another"
}
}
//in your myWebServicePlugin.groovy file, perhaps in the doWithSpring closure
GroovyClassLoader classLoader = new GroovyClassLoader(getClass().getClassLoader())
ConfigObject config
try {
config = new ConfigSlurper().parse(classLoader.loadClass('MyWebServicePluginConfig'))
} catch (Exception e) {/*??handle or what? use default here?*/}
assert config.test.property1.equals("another") == true
Вы можете захотеть сохранить это просто (tm). Вы можете определить URL прямо в Config. groovy - включая настройки среды - и при необходимости обращайтесь к нему из вашего плагина, используя grailsApplication.config (в большинстве случаев) или объект ConfigurationHolder.config (см. подробности в руководстве ).
В качестве дополнительного бонуса этот параметр также может быть определен в стандартных файлах свойств Java или в других файлах конфигурации, указанных в grails.config.locations.
например, в Config.groovy
// This will be the default value...
myPlugin.url=http://somewhe.re/test/endpoint
environments {
production {
// ...except when running in production mode
myPlugin.url=http://somewhe.re/for-real/endpoint
}
}
позже, в службе, предоставляемой вашим plugin
import org.codehaus.groovy.grails.commons.ConfigurationHolder
class MyPluginService {
def url = ConfigurationHolder.config.myPlugin.url
// ...
}