MultipartEntityBuilder de Java y LinkageError de java.lang.
Tengo una aplicación de Java ejecutándose bajo Apache Tomcat 8.0.21.0 en un servidor RHEL 7.8. Toma entrada de un explorador web y carga un archivo a otra aplicación de Java que se ejecuta en un servidor remoto.
El código parcial es el siguiente:
// El elemento de archivo “fileToUpload” se pasa a través de una entrada HTML de tipo
// “archivo” en una página JSP
private void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
try
{
if (ServletFileUpload.isMultipartContent(request))
{
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List
// findFileItem() y generateFileDetails() son funciones locales
FileItem fileItemToUpload = findFileItem(fileItems, "fileToUpload");
String fileDetails = generateFileDetails(fileItemToUpload);
MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();
entityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
entityBuilder.addTextBody("fileDetails", fileDetails);
InputStream is = fileItemToUpload.getInputStream();
entityBuilder.addBinaryBody("is", is);
HttpEntity entity = entityBuilder.build(); // Excepción lanzada aquí
String url = "[URL del servidor remoto]";
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(url);
httpPost.setEntity(entity);
CloseableHttpResponse response = httpClient.execute(httpPost);
.
.
.
response.close();
httpClient.close();
}
else
{
/* manejar POSTs no multiparte */
}
}
catch (Exception e)
{
.
.
.
}
}
La excepción bastante larga es la siguiente:
java.lang.LinkageError: violación de la restricción del cargador: al resolver el método “org.apache.http.entity.mime.MultipartEntityBuilder.build()Lorg/apache/http/HttpEntity;” el cargador de clases (instancia de org/apache/catalina/loader/WebappClassLoader) de la clase actual, uri_test_main/HttpHdlr, y el cargador de clases (instancia de java/net/URLClassLoader) para la clase que define el método, org/apache/http/entity/mime/MultipartEntityBuilder, tienen diferentes objetos de Clase para el tipo er.build()Lorg/apache/http/HttpEntity; usados en la firma
Se lanza en la línea: “HttpEntity entity = entityBuilder.build();”
Ten en cuenta que la excepción es consistente en todos los productos de navegadores.
¿Existe una solución rápida u obvia? Tengo varios trucos disponibles, pero preferiría no usar la clase obsoleta MultipartEntity.
davy.ai
El mensaje de error sugiere que hay un conflicto en los cargadores de clase entre el cargador de clase actual (instancia de org/apache/catalina/loader/WebappClassLoader) y el cargador de clase (instancia de java/net/URLClassLoader) para la clase definitoria del método, org/apache/http/entity/mime/MultipartEntityBuilder. Una posible solución rápida es agregar las siguientes dependencias en el archivo pom.xml:
Esto debería asegurar que las clases requeridas sean cargadas por el mismo cargador de clase y eliminar el error de enlace. Otra opción es cambiar al nuevo método MultipartEntityBuilder.create() que no está obsoleto y debería evitar el problema.