введение значения свойства в бобы весны - PullRequest
1 голос
/ 05 июня 2019

Я хочу знать, почему внедрение свойства @Value работает на классах с аннотацией @Service, но не на классах с @Bean в @Configuration аннотированном классе.

Работает означает, что значение свойства не равно нулю.

Это значение также вводится в два других сервиса, которые я вижу во время отладки в DefaultListableBeanFactory.doResolveDependency. Но я не вижу боб WebserviceEndpoint.

Конфигурация

@Configuration
public class WebserviceConfig {

   // do some configuration stuff

   @Bean
   public IWebserviceEndpoint webserviceEndpoint() {
      return new WebserviceEndpoint();
   }

}

Интерфейс веб-сервиса

@WebService(targetNamespace = "http://de.example/", name = "IWebservice")
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
public interface IWebserviceEndpoint {
    @WebMethod
    @WebResult(name = "response", targetNamespace = "http://de.example/", partName = "parameters")
    public Response callWebservice(@WebParam(partName = "parameters", name = "request", targetNamespace = "http://de.example/") Request request) throws RequestFault;
}

Класс веб-сервиса

public class WebserviceEndpoint implements IWebserviceEndpoint {

   @Value("${value.from.property}")
   private String propertyValue;

}

application.yml

value:
 from:
  property: property-value

Когда в этом случае происходит внедрение @Value.

1 Ответ

1 голос
/ 05 июня 2019

В основном propertyValue равно нулю, потому что Spring вводит значение после создания бина. Итак, когда вы делаете:

@Bean
public IWebserviceEndpoint webserviceEndpoint() {
  return new WebserviceEndpoint();
}

Spring создает новый экземпляр с propertyValue=null. Вы можете инициализировать свой экземпляр атрибута с @ConfigurationProperties

@Bean
@ConfigurationProperties(prefix=...)
public IWebserviceEndpoint webserviceEndpoint() {
   return new WebserviceEndpoint();
}

Обратите внимание, что propertyValue должен иметь установщик.

У вас есть несколько способов решить эту проблему, обычно полезно централизовать свойства в одном классе утилит.

@Component
public class Configs {
  @Value("${propery}"
  String property;

  String getProperty(){ 
    return property;
  }
}

А потом:

@Bean
@ConfigurationProperties(prefix=...)
public IWebserviceEndpoint webserviceEndpoint() {
    WebserviceEndpoint we = new WebserviceEndpoint();
    we.setProperty(configs.getProperty())
   return we;
}

Опять же, есть много разных способов решить эту проблему

...