2016-09-20 2 views
1

Ich versuche, Webservices-Projekt (derzeit SOAP -aber REST fügt schließlich), mit Java-Config. Leider war ich nicht in der Lage, die WSDL automatisch zu exponieren (angeblich kann Spring sie basierend auf den XSDs erzeugen und aufdecken).Spring-ws javaconfig Standorttransformation

Die einzige Dokumentation, die ich gefunden habe, verwendet XML-Konfiguration beim Definieren des Servlets (web.xml).

<init-param> 
    <param-name>transformWsdlLocations</param-name> 
    <param-value>true</param-value> 
</init-param> 

Wie erreichen Sie dies mit Java-Config?

WebApplicationInitializer

public class WebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { 

/** 
* {@inheritDoc} 
*/ 
@Override 
protected Class<?>[] getRootConfigClasses() { 

    return new Class[] {WebSecurityConfiguration.class}; 
} 

/** 
* {@inheritDoc} 
*/ 
@Override 
protected Class<?>[] getServletConfigClasses() { 

    return new Class[] {WebServicesConfiguration.class}; 
} 

/** 
* {@inheritDoc} 
*/ 
@Override 
protected String[] getServletMappings() { 

    // get all mappings 
    return new String[] { "/" }; 
} 

WebServicesConfiguration

@EnableWs 
@Configuration 
@ComponentScan("com.questsoftware") 
public class WebServicesConfiguration extends WsConfigurationSupport { 


@Bean 
public XsdSchema schema() { 

    return new SimpleXsdSchema(new ClassPathResource("lookup.xsd")); 
} 

@Bean 
public DefaultWsdl11Definition defaultWsdl11Definition() { 

    DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition(); 
    wsdl11Definition.setTargetNamespace("http://com/[mycompany]/Lookup"); 
    wsdl11Definition.setPortTypeName("Lookup"); 
    wsdl11Definition.setLocationUri("/Lookup"); 
    wsdl11Definition.setSchema(schema()); 

    return wsdl11Definition; 
} 

klar zu sein - ich habe auch eine WebApplicationConfiguration (REST) ​​-aber ich habe es nicht in den WebApplicationInitializer hinzugefügt (RAN über dieses Problem zuerst).

WebApplicationConfiguration

@EnableWebMvc 
@EnableAspectJAutoProxy(proxyTargetClass = true) 
@Configuration 
@ComponentScan("com.mycompany") 
public class WebApplicationConfiguration extends WebMvcConfigurerAdapter { 


/** 
* Defines {@link JdbcTemplate} as a Spring managed bean. 
* 
* @return 
*/ 
@Bean 
public JdbcTemplate jdbcTemplate() { 

    return new JdbcTemplate(dataSource()); 
} 

@Bean 
public DataSource dataSource() { 

    ... 

    return dataSource; 
} 

/** 
* Defines a {@link ViewResolver} as a Spring managed bean. 
* 
* @return the viewResolver 
*/ 
@Bean 
public ViewResolver viewResolver() { 

    final InternalResourceViewResolver resolver = new InternalResourceViewResolver(); 
    resolver.setPrefix("/WEB-INF/pages"); 
    resolver.setSuffix(".jsp"); 

    return resolver; 
} 

/** 
* Registers resource handlers with Spring. 
* 
* @param registry the {@link ResourceHandlerRegistry} 
*/ 
@Override 
public void addResourceHandlers(ResourceHandlerRegistry registry) { 

    registry.addResourceHandler("/view/**").addResourceLocations("/view/"); 
} 

Referenz

http://docs.spring.io/spring-ws/sites/2.0/reference/html/server.html#server-automatic-wsdl-exposure

Antwort

0

ich in der Lage war, mit einer Lösung zu kommen, aber ich bin mir nicht ganz sicher, ob es die 'richtige' ist oder "bevorzugte" Art und Weise.

Ich folgte dem Tutorial und einfach die Beans in meiner Java-Config-basierten WebApplicationConfiguration definiert, die in der XML-basierten Tutorials Tutorials definiert wurden. - Mein Verständnis, ist, dass es wirklich keinen zugrunde liegenden Unterschied gibt, und Sie müssen einfach die Bohnen zum Frühlingscontainer hinzugefügt haben, also kann Spring arbeiten es ist Magie.

Ich habe den obigen Code mit folgenden Änderungen aktualisiert:

WebApplicationConfiguration

addierten die folgenden Bohnen

/** 
* Defines the {@link SaajSoapMessageFactory} as a Spring managed bean. 
* 
* Note: we need a Soap implementation of a MessageFactory to create soap messages in Spring-WS. 
* 
* @return the messageFactory 
*/ 
@Bean 
public SaajSoapMessageFactory messageFactory() { 

    return new SaajSoapMessageFactory(); 
} 

/** 
* Defines the {@link WebServiceMessageReceiverHandlerAdapter} as a Spring managed bean. 
* 
* Note: We need to add this bean to the context in order for the DispatcherServlet to delegate to a MessageDispatcher 
* (as opposed to Controllers). The MessageDispatcher is necessary for Spring-WS. 
* 
* @return the webServiceMessageReceiverHandlerAdapter 
*/ 
@Bean 
public WebServiceMessageReceiverHandlerAdapter webServiceMessageReceiverHandlerAdapter() { 

    WebServiceMessageReceiverHandlerAdapter adapter = new WebServiceMessageReceiverHandlerAdapter(); 
    adapter.setMessageFactory(messageFactory()); 

    return adapter; 
} 

/** 
* Defines the {@link SimpleUrlHandlerMapping} as a Spring managed bean. 
* 
* Note: In order for the DispatcherServlet to handle SOAP message, we were forced to add the {@link WebServiceMessageReceiverHandlerAdapter} 
* to the context. By explicitely adding that bean to the context, we are now forced to also add this bean to handle REST messages. 
* 
* @return the simpleUrlHandlerMapping 
*/ 
@Bean 
public SimpleUrlHandlerMapping simpleUrlHandlerMapping() { 

    SimpleUrlHandlerMapping simpleUrlHandlerMapping = new SimpleUrlHandlerMapping(); 
    simpleUrlHandlerMapping.setDefaultHandler(messageDispatcher()); 
    Properties urlProperties = new Properties(); 

    urlProperties.put("Lookup.wsdl", "Lookup"); 

    simpleUrlHandlerMapping.setMappings(urlProperties); 
    simpleUrlHandlerMapping.setDefaultHandler(messageDispatcher()); 

    return simpleUrlHandlerMapping; 
} 

/** 
* Defines the {@link SoapMessageDispatcher} as a Spring managed bean. 
* 
* Note: Dispatches SOAP messages. 
* 
* @return the messageDispatcher 
*/ 
@Bean 
public SoapMessageDispatcher messageDispatcher() { 

    return new SoapMessageDispatcher(); 
} 

/** 
* Defines the {@link SimpleControllerHandlerAdapter} as a Spring managed bean. 
* 
* Note: In order for the DispatcherServlet to handle SOAP messages, we were forced to add the {@link WebServiceMessageReceiverHandlerAdapter} 
* to the context. By explicitely adding that bean to the context, the default adapters were not automatically added to handle 
* standard MVC Controllers. We must add this bean to do that. 
* 
* @return the simpleControllerHandlerAdapter 
*/ 
@Bean 
public SimpleControllerHandlerAdapter simpleControllerHandlerAdapter() { 

    return new SimpleControllerHandlerAdapter(); 
} 

WebServicesConfiguration

@ComponentScan ("com.mycompany") entfernt - Die WebApplicationConfiguration hat dies bereits für mich erledigt und nimmt tatsächlich alle Beans in dieser Konfiguration auf.

addierten die folgenden Bohne

@Bean 
public WsdlDefinitionHandlerAdapter wsdlDefinitionHandlerAdapter() { 

    WsdlDefinitionHandlerAdapter wsdlDefinitionHandlerAdapter = new WsdlDefinitionHandlerAdapter(); 
    wsdlDefinitionHandlerAdapter.setTransformLocations(true); 

    return wsdlDefinitionHandlerAdapter; 
} 

Hinweis !!! - In der Bean-Definition von WsdlDefinitionHandlerAdapter rufe ich den Setter für transformLocations auf.Dies zusammen mit dem URL-Mapping in der WebApplicationConfig ist der Schlüssel zum Offenlegen der WSDL. Natürlich sind die anderen Bohnen erforderlich, aber das war der Kern der ursprünglichen Frage.

Verwandte Themen