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

Reply via email to