Reputation: 592
I have been struggling with that error for long time, have googled, looked at the examples around the web and still not getting to work. To be honest I don't understand why my project throws this error.
Caused by: java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [org.springframework.oxm.Marshaller] for property 'marshaller': no matching editors or conversion strategy found
at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:264)
at org.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrapperImpl.java:448)
... 52 more)
at junit.framework.Assert.fail(Assert.java:57)
at junit.framework.TestCase.fail(TestCase.java:227)
at junit.framework.TestSuite$1.runTest(TestSuite.java:100)
at junit.framework.TestCase.runBare(TestCase.java:141)
at junit.framework.TestResult$1.protect(TestResult.java:122)
at junit.framework.TestResult.runProtected(TestResult.java:142)
at junit.framework.TestResult.run(TestResult.java:125)
at junit.framework.TestCase.run(TestCase.java:129)
at junit.framework.TestSuite.runTest(TestSuite.java:255)
at junit.framework.TestSuite.run(TestSuite.java:250)
at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:84)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
So my setup is Spring Web Services, Jaxb2, maven. I have predefined xsd files and generated java classes from them by jaxb2 maven plugin.
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<executions>
<execution>
<id>schema1-xjc</id>
<goals>
<goal>xjc</goal>
</goals>
<configuration>
<schemaDirectory>src/main/resources/</schemaDirectory>
<schemaFiles>ApplicationResponse.xsd</schemaFiles>
<packageName>com.package.response</packageName>
</configuration>
</execution>
</executions>
</plugin>
My pom has additionally these dependencies:
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>${jaxb.api.version}</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.2.7</version>
<!-- <exclusions>
<exclusion>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
</exclusion>
</exclusions> -->
</dependency>
<dependency>
<groupId>org.apache.xmlbeans</groupId>
<artifactId>xmlbeans</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.stream</groupId>
<artifactId>sjsxp</artifactId>
<version>1.0.2</version>
</dependency>
Here is my appContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:sws="http://www.springframework.org/schema/web-services"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.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/util
http://www.springframework.org/schema/util/spring-util-2.0.xsd">
<context:component-scan base-package="com.package" />
<sws:annotation-driven />
<bean id="messageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory">
<property name="soapVersion">
<util:constant static-field="org.springframework.ws.soap.SoapVersion.SOAP_11" />
</property>
</bean>
<bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate">
<constructor-arg ref="messageFactory"/>
<property name="defaultUri" value="https://example/address/hidden"/>
<property name="marshaller" value="marshaller" />
<property name="unmarshaller" value="marshaller" />
</bean>
<bean id="marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="contextPath" value="com.package.request:com.package.request" />
</bean>
</beans>
My service client class
@Component
public class NorServiceClient implements NorService {
@Autowired
private WebServiceTemplate wsTemplate;
public void setDefaultUri(String defaultUri) {
wsTemplate.setDefaultUri(defaultUri);
}
public ApplicationResponse downloadFileList(ApplicationRequest request) {
// Command: DownloadFileList
return (ApplicationResponse) wsTemplate.marshalSendAndReceive(request);
}
}
And my test case:
public class AppTest extends TestCase {
private ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/appContext.xml");
@Test
public void testApplicationRequest() {
assertNotNull(new Object());
System.out.println("Context: " + context);
NorService norService = (NorService) context.getBean("norServiceClient");
ApplicationRequest request = new ApplicationRequest();
nordeaService.downloadFileList(request);
}
}
When launching my app it doesn't even get to the service.downloadFileList, it throws the exception when initializing context. So I don't think it may be the problem that I have instatiated just empty ApplicationRequest object.
Where could the problem lie? By all the examples in the internet I have done setup the same way, but in my project it throws the exception that no matching editors or conversion strategy found
Upvotes: 1
Views: 14267
Reputation: 279960
I assume your error refers to this
<property name="marshaller" value="marshaller" />
The property marshaller
refers to a field of type org.springframework.oxm.Marshaller
of the class org.springframework.ws.client.core.WebServiceTemplate
. You can't give it a String value of "marshaller"
.
You want to reference another bean in the context with the id marshaller
.
<property name="marshaller" ref="marshaller" />
Same thing for your unmarshaller
.
Upvotes: 6