Есть ли способ настроить относительный адрес атрибута длятег? - PullRequest
0 голосов
/ 28 июля 2011

Я застрял с проблемой, которая кажется простой, но не может ее решить.

Мне нужно настроить веб-приложение Spring MVC с CXF, чтобы я мог развернуть его в нескольких местах (разныхконтейнеры сервлетов, разные порты).Все работает нормально, но в моей конфигурации XML CXF, где я настраиваю клиента JAX-WS, для работы тега требуется атрибут «адрес» с указанным абсолютным URL.

Вот код:

<jaxws:client id="wsClient" serviceClass="com.foo.WebServiceInterface" address="http://localhost:8092/WSApp/WebServiceImplPort" />    

Есть ли способ изменить адрес на относительное или другое простое решение для достижения моей цели?Спасибо!

Ответы [ 2 ]

0 голосов
/ 28 января 2015

Ну, где разместить конфигурацию - спорный вопрос, и это зависит от вкусов. Опираясь на фильтры ресурсов maven, необходимо снова объединить войну в каждом развертывании. Для меня это не вариант.

Вариант 1 Пружинные профили

Вы можете определить различные профили пружины в соответствии с настройками развертывания, например, определить в файле свойств, где развернуты остальные службы.

<beans profile="develop">
   <context:property-placeholder location="classpath:develop-config.properties" />
</beans>

<beans profile="production">
  <context:property-placeholder location="classpath:production-config.properties" />
</beans>

<jaxws:client id="wsClient" serviceClass="com.foo.WebServiceInterface" address="${address}" /> 

production-config.properties может иметь:

address=http://localhost:8092/WSApp/WebServiceImplPort

Чтобы активировать ваш любимый профиль: Запустите приложение, используя -Dspring.profiles.active = production

Вариант 2 Пружинная среда

Spring представляет механизм, позволяющий включать или активировать профили программно. Это может быть использовано для чтения различных файлов конфигурации для каждой среды. Или вы можете сделать доступными для вашей весны контекстные переменные системы Java или переменные среды операционной системы. Если вы хотите следовать руководству по применению 12 factor о конфигурации. Говорят, что конфигурация должна быть размещена в переменных среды. Вернее вы предпочитаете 1 войну Многим подходам к развертыванию. Это ваш выбор.

import org.springframework.context.ApplicationContextInitializer;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MapPropertySource;
import org.springframework.core.io.support.ResourcePropertySource;
import org.springframework.web.context.ConfigurableWebApplicationContext;

public class EnviromentDiscovery implements org.springframework.context.ApplicationContextInitializer.ApplicationContextInitializer<org.springframework.context.ApplicationContextInitializer.ConfigurableWebApplicationContext> {

    public void initialize(ConfigurableWebApplicationContext ctx) {
        ConfigurableEnvironment environment = ctx.getEnvironment();      
        // This variable has the same meaning as host, but i can be redefined in
        // case of cluster deployment.
        String hostname= InetAddress.getLocalHost().getHostName();
        logger.info("Application deployed int host {} using context path: {}", engineName, contextPath);
        // You should define a method which load your config.properties according your own criteria depending for example on your hostname.
        InputStream configurationSource = getResourceAsStream(hostname);
        Properties config = new Properties();
        config.load(configurationSource);        
        // Take your address endpoint
        String address = config.getProperty("address");
        Map<String, Object> props = new HashMap<>();
        props.put("address", address);

        MapPropertySource mapSource = new MapPropertySource("props", props);
        // Voilá! your property address is available under spring context!
        environment.getPropertySources().addLast(mapSource);
        ctx.registerShutdownHook();
    }
}

Теперь ваш контекстный файл выглядит так:

Не забудьте добавить в свой web.xml

  <context-param>
    <param-name>contextInitializerClasses</param-name>
    <param-value>net.sf.gazpachoquest.bootstrap.EnviromentDiscovery</param-value>
  </context-param>

Подробнее о Spring spring здесь : или если вы хотите проверить мое подтверждение концепции здесь .

0 голосов
/ 29 июля 2011

Если вы используете maven (или, возможно, даже в ant) ​​для развертывания, вы можете использовать свойства в вашем XML-файле и включить фильтрацию ресурсов в pom, чтобы установить этот параметр для каждой среды.

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
        </resource>
    </resources>
    <!-- Turn on filtering of test resources to allow the correct environment for unit tests -->
    <testResources>
        <testResource>
            <directory>src/test/resources</directory>
            <filtering>true</filtering>
        </testResource>
    </testResources>
</build>

Еще одна опция в коде, когда фактически создается ссылка клиента, есть параметризованная опция для передачи URL при создании ссылки клиента.

SomeServiceClientEP client = new SomeServiceClientEP(url, qname);
dynamicallySetEndpoint((BindingProvider) SomeService, destinationURL);

/**
 * Change the destination endpoint url for some service to the
 * provided in the <i>destinationURL</i> parameter
 * 
 * @param service
 *            The {@link SomeService} JAXWS proxy for accessing the
 *            service
 * @param destinationURL
 *            The URL of the SomeService to send the
 *            request to. If the URL contains ?wsdl at the end it will be
 *            stripped prior to attempting delivery
 */
protected void dynamicallySetEndpoint( BindingProvider service, final String destinationURL) {
    Map<String,Object> rc = service.getRequestContext();
    // Strip the ?wsdl off the end of the URL
    String url = destinationURL;
    if (destinationURL.toLowerCase().matches(WsdlSuffixPattern)) {
        url = destinationURL.substring(0, destinationURL.length() - WsdlSuffix.length());
    }
    rc.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, url);
}
...