Size: a a a

Spring Framework and more

2019 May 25

S🕶

Sander 🕶 in Spring Framework and more
проблема решена
источник

S🕶

Sander 🕶 in Spring Framework and more
на всякий случай код покажу, мало ли кому надо
источник

S🕶

Sander 🕶 in Spring Framework and more
@Bean(name = "conversionService")
   @Primary
   public ConversionService getConversionService(List<Converter> converters) {
       ConversionServiceFactoryBean factory = new ConversionServiceFactoryBean();

       factory.setConverters(new HashSet<>(converters));
       factory.afterPropertiesSet();

       return factory.getObject();
   }
источник

RS

Ruslan Stelmachenko in Spring Framework and more
Sander 🕶
@Bean(name = "conversionService")
   @Primary
   public ConversionService getConversionService(List<Converter> converters) {
       ConversionServiceFactoryBean factory = new ConversionServiceFactoryBean();

       factory.setConverters(new HashSet<>(converters));
       factory.afterPropertiesSet();

       return factory.getObject();
   }
Тут есть несколько нарушений/подводных камней.

1. Методы, создающие бины, не принято называть get*. Это не геттеры. Это фабрики бинов по сути. И название метода по умолчанию будет названием бина. У вас оно переопределено в аннотации, но зачем? можно же просто назвать метод conversionService, а не getConversionService. Это конечно ни на что не влияет, но просто так принято. Нет смысла делать иначе.

2. ConversionServiceFactoryBean (как и любой другой FactoryBean) не предназначен для такого использования. В крайнем случае можно создать отдельный бин для него, т.е. вернуть из метода не ConversionService, а прямо ConversionServiceFactoryBean - и спринг сам создаст ConversionService, вызвав getObject(), когда ему нужно будет куда-то заинжектить бин ConversionService (проинициализировав при этом FactoryBean, так что не нужны будут хаки в виде factory.afterPropertiesSet()).
Хотя на самом деле и так делать не рекомендуются. FactoryBean - классы в основном предназначены для использования из XML-конфигурации спринга. В Java-конфигурации они просто не нужны, т.к. можно создавать объекты с любым скоупом напрямую. Да собственно прямо в жавадоках класса ConversionServiceFactoryBean написано "Like all FactoryBean implementations, this class is suitable for use when configuring a Spring application context using Spring <beans> XML. When configuring the container with @Configuration classes, simply instantiate, configure and return the appropriate ConversionService object from a @Bean method.".

3. Если используете spring-boot, то надо быть аккуратным с бином с названием conversionService. По-умолчанию бут использует бин с таким именем для биндинга пропертей из application.properties. Если в контектсе он не находит бина с таким именем, он создает его сам и добавляет туда дефолтные конвереты, которые, например, преобразуют строку 5s в объект Duration со значением 5 секунд и делают некоторые другие полезные штуки. Если же он возьмет из контекста ваш conversionService, то там будут только те конвертеры, которые вы туда добавили плюс дефолтные конвертеры из DefaultConversionService. А дефолтных от спринг-бут не будет. Так что лучше от греха подальше назвать свой СonversionService, предназначенный для использования программно в приложении, как-то иначе.
источник

S🕶

Sander 🕶 in Spring Framework and more
Ruslan Stelmachenko
Тут есть несколько нарушений/подводных камней.

1. Методы, создающие бины, не принято называть get*. Это не геттеры. Это фабрики бинов по сути. И название метода по умолчанию будет названием бина. У вас оно переопределено в аннотации, но зачем? можно же просто назвать метод conversionService, а не getConversionService. Это конечно ни на что не влияет, но просто так принято. Нет смысла делать иначе.

2. ConversionServiceFactoryBean (как и любой другой FactoryBean) не предназначен для такого использования. В крайнем случае можно создать отдельный бин для него, т.е. вернуть из метода не ConversionService, а прямо ConversionServiceFactoryBean - и спринг сам создаст ConversionService, вызвав getObject(), когда ему нужно будет куда-то заинжектить бин ConversionService (проинициализировав при этом FactoryBean, так что не нужны будут хаки в виде factory.afterPropertiesSet()).
Хотя на самом деле и так делать не рекомендуются. FactoryBean - классы в основном предназначены для использования из XML-конфигурации спринга. В Java-конфигурации они просто не нужны, т.к. можно создавать объекты с любым скоупом напрямую. Да собственно прямо в жавадоках класса ConversionServiceFactoryBean написано "Like all FactoryBean implementations, this class is suitable for use when configuring a Spring application context using Spring <beans> XML. When configuring the container with @Configuration classes, simply instantiate, configure and return the appropriate ConversionService object from a @Bean method.".

3. Если используете spring-boot, то надо быть аккуратным с бином с названием conversionService. По-умолчанию бут использует бин с таким именем для биндинга пропертей из application.properties. Если в контектсе он не находит бина с таким именем, он создает его сам и добавляет туда дефолтные конвереты, которые, например, преобразуют строку 5s в объект Duration со значением 5 секунд и делают некоторые другие полезные штуки. Если же он возьмет из контекста ваш conversionService, то там будут только те конвертеры, которые вы туда добавили плюс дефолтные конвертеры из DefaultConversionService. А дефолтных от спринг-бут не будет. Так что лучше от греха подальше назвать свой СonversionService, предназначенный для использования программно в приложении, как-то иначе.
addConversionServices?
источник

NB

Nikita Bezverkhy in Spring Framework and more
Sander 🕶
@Bean(name = "conversionService")
   @Primary
   public ConversionService getConversionService(List<Converter> converters) {
       ConversionServiceFactoryBean factory = new ConversionServiceFactoryBean();

       factory.setConverters(new HashSet<>(converters));
       factory.afterPropertiesSet();

       return factory.getObject();
   }
ужасный код, хех
источник

S🕶

Sander 🕶 in Spring Framework and more
Nikita Bezverkhy
ужасный код, хех
тут ничего и нет в коде, чтоб говоирть что он ужасный, как ты бы этот код написал? чтоб решить проблему с конвертером.
источник

NB

Nikita Bezverkhy in Spring Framework and more
Баелдунг конечно иногда полезен
но неужели это причина, почему многие люди дают бинам имена и пишут автовайред
источник

NB

Nikita Bezverkhy in Spring Framework and more
Sander 🕶
тут ничего и нет в коде, чтоб говоирть что он ужасный, как ты бы этот код написал? чтоб решить проблему с конвертером.
ужасно, что у тебя нет понимания, как это всё работает под коробкой)
источник

S🕶

Sander 🕶 in Spring Framework and more
Nikita Bezverkhy
ужасно, что у тебя нет понимания, как это всё работает под коробкой)
я не так много пишу на спринге
источник

NB

Nikita Bezverkhy in Spring Framework and more
зачем писать бин нейм, когда можно просто назвать метод таким именем?
источник

S🕶

Sander 🕶 in Spring Framework and more
я уже исправил лол
источник

NB

Nikita Bezverkhy in Spring Framework and more
ну как бы я хз, я просто работаю со спрингом и сразу вижу все косяки и подводные камни
большинство из них господин выше уже подробно описал))
источник

S🕶

Sander 🕶 in Spring Framework and more
я думаю для меня простительно, если я бы ток со спрингом работал, то это был бы другой разговор
источник
2019 May 26

AS

Andrey Sidorenko in Spring Framework and more
@RequestParam("tradepoints", required = false) tradePointIds: List<Long>?
Можно каким-то образом сделать так, что если ничего не передается в tradepoints - список пустой, а не null?
источник

NB

Nikita Bezverkhy in Spring Framework and more
Andrey Sidorenko
@RequestParam("tradepoints", required = false) tradePointIds: List<Long>?
Можно каким-то образом сделать так, что если ничего не передается в tradepoints - список пустой, а не null?
как минимум 2 варианта пришло в голову
но что тебе мешает гуглить такие простые вопросы и находить ответ самостоятельно?
P.S: гуглить желательно на инглише, в основном, ответы находятся
источник

AS

Andrey Sidorenko in Spring Framework and more
А я и пытался
источник

NB

Nikita Bezverkhy in Spring Framework and more
Andrey Sidorenko
А я и пытался
у аноташки есть параметр defaultValue?
источник

NB

Nikita Bezverkhy in Spring Framework and more
вроде должен быть
источник

AS

Andrey Sidorenko in Spring Framework and more
пытался указывать
источник