Existe un bug en la última versión de ADF Studio Edition Version 12.2.1.0.0 y Glassfish 4.1 que no permite subir archivos utilizando el componente af:inputFile. El error se produce en la clase MultipartFormHandler.class de trinidad-impl.jar (ver. 2.0.0).
Si estamos utilizando af:inputFile con un af:form y la propiedad usesUpload a true.
<af:form id=»f1″ usesUpload=»true»>
<af:inputFile label=»Archivo» id=»dc_if1″ />
</af:form>
Cuando intentamos subir un archivo a nuestra aplicación, Glassfish devuelve el siguiente error:
java.io.EOFException at org.apache.myfaces.trinidadinternal.share.util.MultipartFormHandler.
_skipBoundary(MultipartFormHandler.java:229) at org.apache.myfaces.trinidadinternal.share.util.MultipartFormHandler.
<init>(MultipartFormHandler.java:102) at org.apache.myfaces.trinidadinternal.share.util.MultipartFormHandler.<init>(MultipartFormHandler.java:75) at org.apache.myfaces.trinidadinternal.config.upload.FileUploadConfiguratorImpl.
beginRequest(FileUploadConfiguratorImpl.java:139) at org.apache.myfaces.trinidadinternal.config.GlobalConfiguratorImpl.
_startConfiguratorServiceRequest(GlobalConfiguratorImpl.java:746) at org.apache.myfaces.trinidadinternal.config.GlobalConfiguratorImpl.
beginRequest(GlobalConfiguratorImpl.java:227) at org.apache.myfaces.trinidadinternal.webapp.TrinidadFilterImpl.doFilter(TrinidadFilterImpl.java:184) at org.apache.myfaces.trinidad.webapp.TrinidadFilter.doFilter(TrinidadFilter.java:92) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
El método _parseBoundary(String ), no está devolviendo la cadena correcta. En algunos casos al parámetro boundary que devuelve se le está sumando la cadena “charset=UTF-8”.
MultipartFormHandler.java
Método original:
Para resolverlo, descargaremos la versión de trinidad-impl.jar que está usando ADF (trinidad-impl-2.0.0-sources.jar.zip). Y añadiremos el siguiente parche:
Donde nos quedamos con el valor de boundary descartando cualquier string que se añada después (“charset=UTF-8” en nuestro caso).
Compilamos trinidad-impl y sustituimos el jar en el despliegue de nuestra aplicación.
trinidad-impl-2.0.0-sources.jar.zip
Hilos abiertos sobre el bug:
https://community.oracle.com/message/13845423#13845423
https://community.oracle.com/message/13845425#13845425
https://community.oracle.com/message/13845473#13845473
https://community.oracle.com/message/13845424#13845424
https://community.oracle.com/message/13845421#13845421