Hi
here is the test I did locally:
@Test
public void testMultipartPostCollection() throws Exception {
String address = "http://localhost:" + PORT +
"/bookstore/books/asset";
WebClient wc = WebClient.create(address);
wc.type(MediaType.MULTIPART_FORM_DATA).accept(MediaType.APPLICATION_JSON);
Collection<Attachment> atts = new LinkedList<Attachment>();
atts.add(new Attachment("asset",
MediaType.APPLICATION_JSON,
new Book("Asset", 123L)));
atts.add(new Attachment("binary",
MediaType.APPLICATION_OCTET_STREAM,
new ByteArrayInputStream("empty".getBytes())));
Book book = wc.postCollection(atts, Attachment.class, Book.class);
assertEquals("Asset", book.getName());
}
The only difference at this stage is that I use a 'Book' class instead
of 'Asset',
the server code:
@POST
@Path("/books/asset")
@Consumes("multipart/form-data")
@Produces("application/json")
public Book addBookFormAsset(MultipartBody image) throws Exception {
List<Attachment> atts = image.getAllAttachments();
if (atts.size() != 2) {
throw new WebApplicationException();
}
Book book = atts.get(0).getObject(Book.class);
InputStream is = atts.get(1).getObject(InputStream.class);
String value = IOUtils.readStringFromStream(is);
if (!"empty".equals(value)) {
throw new WebApplicationException();
}
return book;
}
It works fine, it is CXF 2.7.0-SNAPSHOT, but I'm pretty sure nothing has
changed in CXF 2.7.0 regarding the way the attachments are handled.
Can you see what may be different in the above code from the actual test
code ?
If you can package your failing tests as a Maven based project then it
can be simpler to reproduce...
Cheers, Sergey
On 19/09/12 23:01, Joe Ammann wrote:
Hi all
I upgraded from CXF 2.5.2 to 2.6.2 and this causes some of my
application unit tests to fail. The failing tests are all multipart posts.
The code snippet below worked with 2.5.2
wc.path("/rest/packages/{packageName}/assets", pkgName).
type(MediaType.MULTIPART_FORM_DATA).
accept(MediaType.APPLICATION_JSON);
Collection<Attachment> atts = new LinkedList<Attachment>();
atts.add(new Attachment("asset", MediaType.APPLICATION_JSON,
a));
atts.add(new Attachment("binary",
MediaType.APPLICATION_OCTET_STREAM, new
ByteArrayInputStream("empty".getBytes())));
a2 = wc.postCollection(atts, Attachment.class, Asset.class);
In 2.6.2, this fails on the client before even invoking the request in
the postCollection() with the following stack trace (full stack at the end):
Caused by: org.apache.cxf.jaxrs.client.ClientWebApplicationException:
.Problem with writing the request message, class : class
java.util.ArrayList, ContentType : multipart/form-data.
at
org.apache.cxf.jaxrs.client.AbstractClient.reportMessageHandlerProblem(AbstractClient.java:629)
~[cxf-rt-frontend-jaxrs-2.6.2.jar:2.6.2]
at
org.apache.cxf.jaxrs.client.AbstractClient.writeBody(AbstractClient.java:396)
~[cxf-rt-frontend-jaxrs-2.6.2.jar:2.6.2]
at
org.apache.cxf.jaxrs.client.WebClient$BodyWriter.handleMessage(WebClient.java:885)
~[cxf-rt-frontend-jaxrs-2.6.2.jar:2.6.2]
... 37 common frames omitted
Caused by: javax.ws.rs.WebApplicationException: null
at
org.apache.cxf.jaxrs.provider.MultipartProvider.getHandlerForObject(MultipartProvider.java:384)
~[cxf-rt-frontend-jaxrs-2.6.2.jar:2.6.2]
I have found related bugs https://issues.apache.org/jira/browse/CXF-4409
but according to Jira this should be fixed in 2.6.2. Any hints what
could be going wrong?
Thanks in advance.
CU, Joe
Full stack trace:
23:38:36.558 [ain] ERROR: ch.pyx.rules.drools.GuvnorAdaptor: Failed to create
Guvnor asset {|||||| - |}
org.apache.cxf.jaxrs.client.ClientWebApplicationException:
org.apache.cxf.jaxrs.client.ClientWebApplicationException:
org.apache.cxf.interceptor.Fault: .Problem with writing the request message,
class : class java.util.ArrayList, ContentType : multipart/form-data.
at
org.apache.cxf.jaxrs.client.WebClient.doChainedInvocation(WebClient.java:807)
~[cxf-rt-frontend-jaxrs-2.6.2.jar:2.6.2]
at org.apache.cxf.jaxrs.client.WebClient.doInvoke(WebClient.java:743)
~[cxf-rt-frontend-jaxrs-2.6.2.jar:2.6.2]
at org.apache.cxf.jaxrs.client.WebClient.doInvoke(WebClient.java:717)
~[cxf-rt-frontend-jaxrs-2.6.2.jar:2.6.2]
at org.apache.cxf.jaxrs.client.WebClient.postCollection(WebClient.java:407)
~[cxf-rt-frontend-jaxrs-2.6.2.jar:2.6.2]
at ch.pyx.rules.drools.GuvnorAdaptor.createAsset(GuvnorAdaptor.java:302)
~[classes/:na]
at
ch.pyx.rules.sl.impl.GuvnorConnectorIntTest.testCreateAndDeleteAsset(GuvnorConnectorIntTest.java:242)
[test-classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.6.0_25]
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
~[na:1.6.0_25]
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
~[na:1.6.0_25]
at java.lang.reflect.Method.invoke(Method.java:597) ~[na:1.6.0_25]
at
org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
[junit-4.8.2.jar:na]
at
org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
[junit-4.8.2.jar:na]
at
org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
[junit-4.8.2.jar:na]
at
org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
[junit-4.8.2.jar:na]
at
org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
[junit-4.8.2.jar:na]
at
org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
[spring-test-3.1.1.RELEASE.jar:3.1.1.RELEASE]
at
org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83)
[spring-test-3.1.1.RELEASE.jar:3.1.1.RELEASE]
at
org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
[spring-test-3.1.1.RELEASE.jar:3.1.1.RELEASE]
at
org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
[spring-test-3.1.1.RELEASE.jar:3.1.1.RELEASE]
at
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)
[junit-4.8.2.jar:na]
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
[junit-4.8.2.jar:na]
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
[junit-4.8.2.jar:na]
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
[junit-4.8.2.jar:na]
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
[junit-4.8.2.jar:na]
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
[junit-4.8.2.jar:na]
at
org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
[junit-4.8.2.jar:na]
at
org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
[spring-test-3.1.1.RELEASE.jar:3.1.1.RELEASE]
at
org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
[spring-test-3.1.1.RELEASE.jar:3.1.1.RELEASE]
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
[junit-4.8.2.jar:na]
at
org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
[spring-test-3.1.1.RELEASE.jar:3.1.1.RELEASE]
at
org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
[.cp/:na]
at
org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
[.cp/:na]
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
[.cp/:na]
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
[.cp/:na]
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
[.cp/:na]
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
[.cp/:na]
Caused by: org.apache.cxf.jaxrs.client.ClientWebApplicationException:
org.apache.cxf.interceptor.Fault: .Problem with writing the request message,
class : class java.util.ArrayList, ContentType : multipart/form-data.
at
org.apache.cxf.jaxrs.client.AbstractClient.checkClientException(AbstractClient.java:496)
~[cxf-rt-frontend-jaxrs-2.6.2.jar:2.6.2]
at
org.apache.cxf.jaxrs.client.AbstractClient.preProcessResult(AbstractClient.java:482)
~[cxf-rt-frontend-jaxrs-2.6.2.jar:2.6.2]
at
org.apache.cxf.jaxrs.client.WebClient.doChainedInvocation(WebClient.java:800)
~[cxf-rt-frontend-jaxrs-2.6.2.jar:2.6.2]
... 35 common frames omitted
Caused by: org.apache.cxf.interceptor.Fault: .Problem with writing the request
message, class : class java.util.ArrayList, ContentType : multipart/form-data.
at
org.apache.cxf.jaxrs.client.WebClient$BodyWriter.handleMessage(WebClient.java:893)
~[cxf-rt-frontend-jaxrs-2.6.2.jar:2.6.2]
at
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:262)
~[cxf-api-2.6.2.jar:2.6.2]
at
org.apache.cxf.jaxrs.client.WebClient.doChainedInvocation(WebClient.java:795)
~[cxf-rt-frontend-jaxrs-2.6.2.jar:2.6.2]
... 35 common frames omitted
Caused by: org.apache.cxf.jaxrs.client.ClientWebApplicationException: .Problem
with writing the request message, class : class java.util.ArrayList,
ContentType : multipart/form-data.
at
org.apache.cxf.jaxrs.client.AbstractClient.reportMessageHandlerProblem(AbstractClient.java:629)
~[cxf-rt-frontend-jaxrs-2.6.2.jar:2.6.2]
at
org.apache.cxf.jaxrs.client.AbstractClient.writeBody(AbstractClient.java:396)
~[cxf-rt-frontend-jaxrs-2.6.2.jar:2.6.2]
at
org.apache.cxf.jaxrs.client.WebClient$BodyWriter.handleMessage(WebClient.java:885)
~[cxf-rt-frontend-jaxrs-2.6.2.jar:2.6.2]
... 37 common frames omitted
Caused by: javax.ws.rs.WebApplicationException: null
at
org.apache.cxf.jaxrs.provider.MultipartProvider.getHandlerForObject(MultipartProvider.java:384)
~[cxf-rt-frontend-jaxrs-2.6.2.jar:2.6.2]
at
org.apache.cxf.jaxrs.provider.MultipartProvider.getHandlerForObject(MultipartProvider.java:395)
~[cxf-rt-frontend-jaxrs-2.6.2.jar:2.6.2]
at
org.apache.cxf.jaxrs.provider.MultipartProvider.createDataHandler(MultipartProvider.java:341)
~[cxf-rt-frontend-jaxrs-2.6.2.jar:2.6.2]
at
org.apache.cxf.jaxrs.provider.MultipartProvider.createDataHandler(MultipartProvider.java:311)
~[cxf-rt-frontend-jaxrs-2.6.2.jar:2.6.2]
at
org.apache.cxf.jaxrs.provider.MultipartProvider.getAttachments(MultipartProvider.java:295)
~[cxf-rt-frontend-jaxrs-2.6.2.jar:2.6.2]
at
org.apache.cxf.jaxrs.provider.MultipartProvider.convertToDataHandlers(MultipartProvider.java:276)
~[cxf-rt-frontend-jaxrs-2.6.2.jar:2.6.2]
at
org.apache.cxf.jaxrs.provider.MultipartProvider.writeTo(MultipartProvider.java:249)
~[cxf-rt-frontend-jaxrs-2.6.2.jar:2.6.2]
at
org.apache.cxf.jaxrs.client.AbstractClient.writeBody(AbstractClient.java:391)
~[cxf-rt-frontend-jaxrs-2.6.2.jar:2.6.2]
... 38 common frames omitted
--
Sergey Beryozkin
Talend Community Coders
http://coders.talend.com/
Blog: http://sberyozkin.blogspot.com