FactoryBean с @Value в конструкторе?

Можно ли добавить непустой конструктор по умолчанию в 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 никогда не будет вызван ...

Да, и @Autowired в вашем случае не нужен

akuma8 30.04.2018 16:15

да :) это так ... но знаете ли вы, что для этого spring.mvc.date-format есть свойство (предположим, что вы используете spring -boot)

Dirk Deyne 30.04.2018 16:16

Насколько я знаю, так и должно работать. В чем тут проблема?

Link64 30.04.2018 16:18

пожалуйста, посмотрите мою правку.

membersound 01.05.2018 09:12
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
129
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Да, но для этого вам не нужен параметр конструктора.

Вместо, вы можете создать метод 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, которая впоследствии больше никогда не будет использоваться. Я стараюсь избегать переменных, которые используются только один раз ...

membersound 01.05.2018 09:13

Вариант 2 основан на ответе @Bartosz Bilicki на этот вопрос: stackoverflow.com/questions/33562731/…

DwB 01.05.2018 15:19

Наличие @Value поверх установщика (вместо параметра) сработало. Вот что я искал!

membersound 02.05.2018 13:12

Другие вопросы по теме