[ https://issues.apache.org/jira/browse/CXF-5835?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14052077#comment-14052077 ]
iris ding commented on CXF-5835: -------------------------------- Sergey, We also have ClassCastException in org.apache.cxf.jaxrs.provider.BinaryDataProvider and org.apache.cxf.jaxrs.provider.SourceProvider. Can we modify them as well? Since this issue is closed, I opened a new one to track this: https://issues.apache.org/jira/browse/CXF-5846 Iris Ding > Two issues in org.apache.cxf.jaxrs.provider.DataSourceProvider > -------------------------------------------------------------- > > Key: CXF-5835 > URL: https://issues.apache.org/jira/browse/CXF-5835 > Project: CXF > Issue Type: Bug > Components: JAX-RS > Affects Versions: 3.0.0 > Reporter: iris ding > Assignee: Sergey Beryozkin > Fix For: 2.7.12, 3.0.1 > > > Issue 1: ClassCastException if you post a FileDataSource in your resource > class: > @Path("providers/standard/datasource") > public class DataSourceResource { > @POST > public DataSource postDataSource(FileDataSource ds) { > return ds; > } > } > The error stack is like below: > Caused by: java.lang.ClassCastException: Cannot cast class > org.apache.cxf.jaxrs.ext.multipart.InputStreamDataSource to class > javax.activation.FileDataSource > at java.lang.Class.cast(Class.java:1730) > at > org.apache.cxf.jaxrs.provider.DataSourceProvider.readFrom(DataSourceProvider.java:55) > at > org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBodyReader(JAXRSUtils.java:1311) > at > org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBody(JAXRSUtils.java:1262) > at > org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameter(JAXRSUtils.java:801) > at > org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameters(JAXRSUtils.java:764) > at > org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.processRequest(JAXRSInInterceptor.java:212) > at > org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.handleMessage(JAXRSInInterceptor.java:76) > at > org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307) > Since there are several implementation class for DataSource, we can not use > the logic below: > public T readFrom(Class<T> cls, Type genericType, Annotation[] > annotations, > MediaType type, > MultivaluedMap<String, String> headers, > InputStream is) > throws IOException { > DataSource ds = new InputStreamDataSource(is, type.toString()); > return cls.cast(DataSource.class.isAssignableFrom(cls) ? ds : new > DataHandler(ds)); > } > Issue 2: Return the original InputStream directly in > InputStreamDataSource.getInputStream(). > I have checked Jersy and Wink's implementation for this part, both of them > will replace the incomming InputStream with ByteArrayInputStream. Using this > way, the inputStream.available() will be correctly be called. > My resource can run successfully both in Jersey and Wink. But failed with > CXF. The resource class snippet is like below: > @POST > public Response post(DataSource dataSource) { > Response resp = null; > try { > InputStream inputStream = dataSource.getInputStream(); > byte[] inputBytes = new byte[inputStream.available()]; > .......... > } > From my understanding, we need to this conversion for InputStream to convert > it to a standard java.io.ByteArrayInputStream. Because only in such way, we > can return to users a standard InputStream. For example, the incomming > InputStream might be a specific type to J2ee container. -- This message was sent by Atlassian JIRA (v6.2#6252)