es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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 fileItems = upload.parseRequest(request);

        // 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.

Tags:  , , , ,

Answer

  1. Avatar for 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:

    <dependency>
        <groupid>org.apache.httpcomponents</groupid>
        <artifactid>httpclient</artifactid>
        <version>4.5.6</version>
    </dependency>
    <dependency>
        <groupid>org.apache.httpcomponents</groupid>
        <artifactid>httpmime</artifactid>
        <version>4.5.6</version>
    </dependency>
    

    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.

Comments are closed.