7. WeatherService.java
Code:
package com.apress.springrecipes.weather;
import java.util.Date;
import java.util.List;
public interface WeatherService {
public List getTemperatures(String city, List<Date> date);
}
8. WeatherServiceImpl.java
Code:
package com.apress.springrecipes.weather;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class WeatherServiceImpl implements WeatherService {
@Override
public List getTemperatures(String city, List<Date> dates) {
List temperatures = new ArrayList();
for (Date date : dates) {
temperatures.add(new TemperatureInfo(city, date, 15.0, 110.0, 8.0));
}
return temperatures;
}
}
Client Side Configuration/java class
9. WeatherServiceClient.java
Code:
package com.apress.springrecipes.weather;
import java.util.List;
import org.springframework.ws.WebServiceMessageFactory;
public class WeatherServiceClient {
private WeatherService weatherService;
public void setWeatherService(WeatherService weatherService) {
this.weatherService = weatherService;
}
public List<TemperatureInfo> getTodayTemperature(String city, List dates) {
return weatherService.getTemperatures(city, dates);
}
}
10. WeatherServiceProxy.java
Code:
package com.apress.springrecipes.weather;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import org.springframework.ws.WebServiceMessageFactory;
import org.springframework.ws.client.core.support.WebServiceGatewaySupport;
import com.apress.springrecipes.weather.schemas.GetTemperaturesRequestDocument;
import com.apress.springrecipes.weather.schemas.GetTemperaturesResponseDocument;
import com.apress.springrecipes.weather.schemas.GetTemperaturesRequestDocument.GetTemperaturesRequest;
import com.apress.springrecipes.weather.schemas.GetTemperaturesResponseDocument.GetTemperaturesResponse;
public class WeatherServiceProxy extends WebServiceGatewaySupport
implements WeatherService {
public WeatherServiceProxy(WebServiceMessageFactory messageFactory) {
super(messageFactory);
}
@Override
public List getTemperatures(String city, List<Date> dates) {
GetTemperaturesRequestDocument requestDoc =
GetTemperaturesRequestDocument.Factory.newInstance();
GetTemperaturesRequest request = requestDoc.addNewGetTemperaturesRequest();
for (Date date : dates) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
request.addDate(calendar);
}
request.setCity(city);
GetTemperaturesResponseDocument responseDoc;
System.out.println(requestDoc.toString());
responseDoc = (GetTemperaturesResponseDocument)
this.getWebServiceTemplate().marshalSendAndReceive(requestDoc);
List infos = new ArrayList();
for (GetTemperaturesResponse.TemperatureInfo response :
responseDoc.getGetTemperaturesResponse().getTemperatureInfoArray()) {
TemperatureInfo info = new TemperatureInfo();
info.setAverage(response.getAverage());
info.setCity(response.getCity());
info.setMax(response.getMax());
info.setMin(response.getMin());
info.setDate(response.getDate().getTime());
infos.add(info);
}
return infos;
}
}
11. client.xml
Code:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean id="messagFactory"
class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory" />
<bean id="abstractClient" abstract="true">
<constructor-arg ref="messagFactory" />
<property name="destinationProvider">
<bean
class="org.springframework.ws.client.support.destination.Wsdl11DestinationProvider">
<property name="wsdl"
value="http://localhost:7001/SpringWS2Web/services/temperature.wsdl" />
</bean>
</property>
</bean>
<bean id="client" class="com.apress.springrecipes.weather.WeatherServiceClient">
<property name="weatherService" ref="weatherServiceProxy" />
</bean>
<bean id="weatherServiceProxy" parent="abstractClient"
class="com.apress.springrecipes.weather.WeatherServiceProxy">
<property name="interceptors" ref="securityInterceptor"/>
<property name="defaultUri" value="http://localhost:7001/SpringWS2Web/services" />
<property name="marshaller" ref="marshaller" />
<property name="unmarshaller" ref="marshaller" />
</bean>
<bean id="marshaller"
class="org.springframework.oxm.xmlbeans.XmlBeansMarshaller">
</bean>
<bean id="securityInterceptor" class="org.springframework.ws.soap.security.wss4j.Wss4jSecurityInterceptor">
<property name="securementActions" value="UsernameToken"/>
<property name="securementUsername" value="john"/>
<property name="securementPassword" value="changeme"/>
</bean>
</beans>
When I test without security it works fine but when i add security on top of it, it fails and through following error
Test
Code:
ApplicationContext context =
new ClassPathXmlApplicationContext("client.xml");
WeatherServiceClient client =
(WeatherServiceClient) context.getBean("client");
List dates = new ArrayList();
dates.add(new Date());
dates.add(new Date());
List<TemperatureInfo> infos = client.getTodayTemperature("Sona", dates)
Error:
Code:
I am in security
john
<Jul 7, 2010 10:33:57 PM IST> <Error> <HTTP> <BEA-101020> <[ServletContext@10371005[app:SpringWS2App module:SpringWS2Web path:/SpringWS2Web spec-version:2.5]] Servlet failed with Exception
org.springframework.ws.soap.client.SoapFaultClientException: No adapter for endpoint [com.apress.springrecipes.weather.TemperatureMarshallingEndpoint@1025478]: Does your endpoint implement a supported interface like MessageHandler or PayloadEndpoint?
at org.springframework.ws.soap.client.core.SoapFaultMessageResolver.resolveFault(SoapFaultMessageResolver.java:37)
at org.springframework.ws.client.core.WebServiceTemplate.handleFault(WebServiceTemplate.java:735)
at org.springframework.ws.client.core.WebServiceTemplate.doSendAndReceive(WebServiceTemplate.java:561)
at org.springframework.ws.client.core.WebServiceTemplate.sendAndReceive(WebServiceTemplate.java:499)
at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:348)
Truncated. see log file for complete stacktrace
It is passing secruity but not able to get endpoint. Please let me know where i am doing wrong.
I am using spring framework 3.0.2, spring security 3.0.0 and spring ws 2.0.0 and wsdl4j-1.6.1.jar, wss4j-1.5.8.jar