java JAXB मार्शलर का उपयोग करने के लिए स्प्रिंग-डब्ल्यूएस को कैसे कॉन्फ़िगर किया जाए?



spring spring-ws (1)

मैं यह ऐसा करने की सिफारिश करेगा, जो कि नवीनतम स्प्रिंग-डब्ल्यूएस के आधार पर थोड़ा अधिक मानक है:

अपने मार्सलर को परिभाषित करने के लिए Oxm नामस्थान का उपयोग करें:

<oxm:jaxb2-marshaller id="marshaller" >
    <oxm:class-to-be-bound name="...Your XMlRootElements.."/>
    <oxm:class-to-be-bound name="more.."/>  
</oxm:jaxb2-marshaller>

या संदर्भपथ निर्दिष्ट करें:

<oxm:jaxb2-marshaller id="marshaller" contextPath="au.test.weather.ws"/>

GenericMarshallingMethodEndpointAdapter और PayloadRootAnnotationMethodEndpointMapping संदर्भ को निकालें , दोनों के बजाय PayloadRootAnnotationMethodEndpointMapping नाम स्थान के साथ बदलें:

<sws:annotation-driven  />

या स्पष्ट रूप से मार्शलर / यूनमरशेलर निर्दिष्ट करें:

<sws:annotation-driven marshaller="marshaller" unmarshaller="marshaller"/>

इन के साथ यदि आप एंडपॉइंट @EndPoint annotaion के साथ परिभाषित है, इन पंक्तियों के साथ:

@Endpoint
public class MyEndPoint{

    @PayloadRoot(namespace = "myns", localPart = "rootelement")
    @ResponsePayload
    public MyResponse myMethod(@RequestPayload MyRequest request)

यह सिर्फ काम करना चाहिए इसके अलावा यदि आपकी मायवरवेश क्लास में एक @XmlRootElement एनोटेशन है, तो आपको @XmlRootElement को निर्दिष्ट करने की आवश्यकता भी नहीं है, यह एक स्वचालित तरीके से निर्मित MethodArgumentResolver का उपयोग कर लिया जाएगा।

संदर्भ: http://static.springsource.org/spring-ws/sites/2.0/reference/html/server.html#server-endpoints

अब तक इस पर मदद के लिए धन्यवाद, मैं सवाल को अद्यतन कर रहा हूं क्योंकि मैंने जो कुछ भी जरूरी नहीं दिखाया था, उसमें दिखाए गए परिवर्तनों को दिखाया गया है। साबुन उत्पादन अब भी नहीं है जो मैं चाहता था

servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:sws="http://www.springframework.org/schema/web-services"
    xmlns:oxm="http://www.springframework.org/schema/oxm"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
                        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                        http://www.springframework.org/schema/web-services
                        http://www.springframework.org/schema/web-services/web-services-2.0.xsd
                        http://www.springframework.org/schema/context 
                        http://www.springframework.org/schema/context/spring-context-3.0.xsd
                        http://www.springframework.org/schema/oxm 
                        http://www.springframework.org/schema/oxm/spring-oxm-3.0.xsd"
                        >

<!--Enables @Endpoint and related Spring-WS annotations.-->
<sws:annotation-driven marshaller="marshaller" unmarshaller="marshaller"/> 

<bean id="weatherService"
    class="au.test.weather.ws.WeatherServiceImpl" />

<bean id="schema" class="org.springframework.xml.xsd.SimpleXsdSchema" 
    p:xsd = "classpath:au/test/weather/ws/schemas/Temperature.xsd"/>

<oxm:jaxb2-marshaller id="marshaller" >
    <oxm:class-to-be-bound name="au.test.weather.ws.GetTemperaturesResponse"/> 
    <oxm:class-to-be-bound name="au.test.weather.ws.GetTemperaturesRequest"/>
    <oxm:class-to-be-bound name="au.test.weather.ws.schemas.Jaxb2Marshaller"/>  
</oxm:jaxb2-marshaller> 

<bean id="temperatureEndpoint"
    class="au.test.weather.ws.TemperatureMarshallingEndpoint">
    <property name="weatherService" ref="weatherService" />
</bean>

मेरी एनोटेटेड कक्षाएं कैसा दिखती हैं

@XmlRootElement(name = "GetTemperaturesRequest")
public class GetTemperaturesRequest {

    @XmlElement(required = true)
    protected String city;
    @XmlElement(required = true)
    @XmlSchemaType(name = "date")
    protected List<XMLGregorianCalendar> date;

    public String getCity() {
        return city;
    }

    public void setCity(String value) {
        this.city = value;
    }

    public List<XMLGregorianCalendar> getDate() {
        if (date == null) {
            date = new ArrayList<XMLGregorianCalendar>();
        }
        return this.date;
    }

    public void setDates(List<XMLGregorianCalendar> dates) {
this.date = dates;  
    }
}

endpoint

@Endpoint
public class TemperatureMarshallingEndpoint {

    private static final String namespaceUri = "http://test.au/schema/weather";
    public static final String request_local_name = "GetTemperaturesRequest";
    private WeatherService weatherService;

    public void setWeatherService(WeatherService weatherService) {
        this.weatherService = weatherService;
    }

    @PayloadRoot(localPart = request_local_name, namespace = namespaceUri)
    @ResponsePayload
    public GetTemperaturesResponse getTemperature(@RequestPayload GetTemperaturesRequest request) throws JAXBException {
        List<GetTemperaturesResponse.TemperatureInfo> temperatures = weatherService.getTemperatures(request.getCity(), request.getDate());

        return new GetTemperaturesResponse(temperatures);
    }       
}

कसौटी

@RunWith(SpringJUnit4ClassRunner.class)  
@ContextConfiguration(locations = {"classpath:servlet.xml"})

public class testOther {

    @Autowired
    private ApplicationContext applicationContext;                                           
    private MockWebServiceClient mockClient;

    @Before
    public void createClient() {
      mockClient = MockWebServiceClient.createClient(applicationContext);                  
    }

    @Test 
    public void TemperatureMarshallingEndpoint() throws Exception {
        Source requestPayload = new StringSource( 
        "<GetTemperaturesRequest xmlns='http://test.au/schema/weather'>" +
        "<city>Houston</city>" +
        "<date>2007-12-01</date>" + 
        "</GetTemperaturesRequest>");      

        Source responsePayload = new StringSource(
        "<GetTemperaturesResponse xmlns='http://test.au/schema/weather'>" +
        "<TemperatureInfo city='Houston' date='2007-12-01'><min>5.0</min><max>10.0</max><average>8.0</average></TemperatureInfo>" +
        "</GetTemperaturesResponse>");

        mockClient.sendRequest(withPayload(requestPayload)).  
        andExpect(payload(responsePayload));  
    }
} 

और यह परीक्षा गुजरती है इसलिए यह सही होना चाहिए, हालांकि साबुन उत्पादन एनएस 2 उपसर्ग जोड़ता है

DEBUG: org.springframework.ws.server.MessageTracing.sent - 
Sent response 
[<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/><SOAP-ENV:Body>
<ns2:GetTemperaturesResponse xmlns:ns2="http://test.au/schema/weather">
    <ns2:TemperatureInfo city="Houston" date="2007-12-01">
        <ns2:min>5.0</ns2:min>
        <ns2:max>10.0</ns2:max>
        <ns2:average>8.0</ns2:average>
    </ns2:TemperatureInfo>
</ns2:GetTemperaturesResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>] 
for request 
[<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/><SOAP-ENV:Body>
<GetTemperaturesRequest xmlns="http://test.au/schema/weather">
    <city>Houston</city>
    <date>2007-12-01</date></GetTemperaturesRequest>
</SOAP-ENV:Body></SOAP-ENV:Envelope>]

यह नाम स्थान कहाँ जोड़ा जाता है?





endpoint