Можно ли добавить непустой конструктор по умолчанию в FactoryBean, где параметр вводится @Value?
@Service
public class DateTimeFormatterFactory implements FactoryBean<DateTimeFormatter> {
private DateTimeFormatter formatter;
@Autowired
public DateTimeFormatterFactory(@Value("${custom.format}") String format) {
formatter = DateTimeFormatter.ofPattern(format);
}
@Override
public DateTimeFormatter getObject() {
return formatter;
}
@Override
public Class<?> getObjectType() {
return DateTimeFormatter.class;
}
@Override
public boolean isSingleton() {
return true;
}
}
/ edit: я должен был добавить сообщение об ошибке. Spring жалуется, что нет конструктора по умолчанию без аргументов. Но если я добавлю один, мой конструктор @Value никогда не будет вызван ...
да :) это так ... но знаете ли вы, что для этого spring.mvc.date-format есть свойство (предположим, что вы используете spring -boot)
Насколько я знаю, так и должно работать. В чем тут проблема?
пожалуйста, посмотрите мою правку.




Да, но для этого вам не нужен параметр конструктора.
Вместо,
вы можете создать метод PostConstruct
и инициализируйте в нем форматтер.
Например,
@Value("${custom.format}")
private String desiredDateFormat;
@PostConstruct
public void postConstruct()
{
formatter = DateTimeFormatter.ofPattern(desiredDateFormat);
}
Вариант 2 (A.K.A ответ на комментарий)
Если вам нужен только value для создания DateTimeFormatter,
затем просто используйте его для создания DateTimeFormatter в
"сеттер-подобный" метод, который я назову "диван"
(потому что я не знаю, как это назвать).
Вот код:
@Value("${custom.format}")
public void createDateTimeFormatter(
final String desiredDateFormat)
{
formatter = DateTimeFormatter.ofPattern(desiredDateFormat);
}
Недостатком является то, что мне пришлось бы ввести дополнительную переменную для инъекции @Value, которая впоследствии больше никогда не будет использоваться. Я стараюсь избегать переменных, которые используются только один раз ...
Вариант 2 основан на ответе @Bartosz Bilicki на этот вопрос: stackoverflow.com/questions/33562731/…
Наличие @Value поверх установщика (вместо параметра) сработало. Вот что я искал!
Да, и @Autowired в вашем случае не нужен