public interface Settings {
String property(String key);
default String property(@NonNull String key, String defaultValue) {
String value = property(key);
return StringUtils.isBlank(value) ? defaultValue : value;
}
void setProperty(String key, String value);
default void setProperty(@NonNull String key, @NonNull Object value) {
setProperty(key, value.toString());
}
// default implementations like getPropertyAsInt, getPropertyAsList, etc
}
@Service("settingsBasedOnApplicationProperties")
public class SettingsBasedOnApplicationProperties implements Settings {
private final Environment applicationProperties;
@Autowired
public SettingsBasedOnApplicationProperties(Environment applicationProperties) {
this.applicationProperties = applicationProperties;
}
@Override
public String property(@NonNull String key) {
String value = applicationProperties.getProperty(key);
return value == null? "" : value;
}
@Override
public void setProperty(String key, String value) {
throw new UnsupportedOperationException(
"It's readonly service."
);
}
}
@AllArgsConstructor
@Service("settingsBasedOnDatabaseProperties")
public final class SettingsBasedOnDatabaseProperties implements Settings {
private final SettingsRepository settingsRepository;
@Override
public String property(@NonNull String key) {
Setting value = settingsRepository.findOne(key);
return value == null ? "" : value.getValue();
}
public void setProperty(@NonNull String key, @NonNull String value) {
settingsRepository.save(new Setting(key, value));
}
}
@Service("settings")
public class SettingsImpl implements Settings {
private final Settings applicationProperties;
private final Settings databaseProperties;
@Autowired
public SettingsImpl(
@Qualifier("settingsBasedOnApplicationProperties") Settings applicationProperties,
@Qualifier("settingsBasedOnDatabaseProperties") Settings databaseProperties) {
this.applicationProperties = applicationProperties;
this.databaseProperties = databaseProperties;
}
@Override
public String property(String key) {
return StringUtils.isBlank(applicationProperties.property(key))
? databaseProperties.property(key)
: applicationProperties.property(key);
}
@Override
public void setProperty(String key, String value) {
databaseProperties.setProperty(key, value);
}
}
Таким образом, мы делаем Autowired для Settings и получаем значение проперти. Если она есть в конфиге (.properties файл или .yaml) или в environment variables — берем от туда. Если нет — берем с базы данных. Логику можно поменять и сделать значение в базе данных «главным». Похожим путем можно инкапсулировать получение значений с любых источников.
Сайту ничего не мешает вас забанить и при запросах в один поток. Всё упирается в разумную паузу между отправкой запросов или пачками запросов (скажем, отправляем N запросов, засыпаем на M секунд, снова отправляем и т.д.).
Таким образом, мы делаем Autowired для Settings и получаем значение проперти. Если она есть в конфиге (.properties файл или .yaml) или в environment variables — берем от туда. Если нет — берем с базы данных. Логику можно поменять и сделать значение в базе данных «главным». Похожим путем можно инкапсулировать получение значений с любых источников.
Примерно так:
Spring сам найдет нужный Converter (по типу объекта userObject и target class) и вызовет converter.
Можно пример?
Выгрузку результатов запроса в Excel стоит ли когда-нибудь ожидать?