eclipse рэп скачать сервис сервлет ошибка - PullRequest
0 голосов
/ 01 марта 2019

Недавно я создал программу Eclipse RAP с использованием пакета javax.servlet для создания службы загрузки файлов.Он работает довольно хорошо при использовании встроенного сервера в Eclipse IDE.Однако после развертывания программы на сервере Tomcat при открытии ссылки на скачивание сообщение об ошибке показывает ошибку HTTP 500 следующим образом:

Тип: Отчет об исключении

Сообщение: выполнение сервлетавыбросило исключение Описание Сервер обнаружил непредвиденное состояние, которое не позволило ему выполнить запрос.

Исключение: javax.servlet.ServletException: выполнение сервлета вызвало исключение org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

Основная причина: java.lang.LinkageError: нарушение ограничения загрузчика: loader (экземпляр org / eclipse / osgi / internal / loader / EquinoxClassLoader) ранее инициировал загрузку для другого типа с помощьюимя "javax / servlet / http / HttpServletResponse" testproject.DownloadServiceHandler.service (DownloadServiceHandler.java:59) org.eclipse.rap.rwt.engine.RWTServlet.handleValidRequest (RWTServlet.j.p.w.w.w.lv1 )1engine.RWTServlet.handleRequest (RWTServlet.java:117) org.eclipse.rap.rwt.engine.RWTServlet.doGet (RWTServlet.java:100) javax.servlet.http.HttpServlet.service (HttpServlet.java:635) javax.servlet.http.HttpServlet.service (HttpServ: 7)org.eclipse.rap.rwt.osgi.internal.CutOffContextPathWrapper.service (CutOffContextPathWrapper.java:106) org.eclipse.equinox.http.servlet.internal.HttpServiceRuntimeImpl $ LegacyService.jlequinox.http.servlet.internal.registration.EndpointRegistration.service (EndpointRegistration.java:151) org.eclipse.equinox.http.servlet.internal.servlet.ResponseStateHandler.processRequest (ResponseStateHandler.java:inoxe.jipe.sex.sex или.http.servlet.internal.context.DispatchTargets.doDispatch (DispatchTargets.java:134) org.eclipse.equinox.http.servlet.internal.servlet.ProxyServlet.service (ProxyServlet.java:103) javax.servlet.ptv.служба (HttpServlet.java:742) org.eclipse.equinox.servletbridge.BridgeServlet.service (BridgeServlet.java:158) javax.servlet.http.HttpServlet.service (HttpServlet.java:742) org.apache.tomcat.websocket.server.WsFilter.doFilter (WsFilter.java:52)

Ниже приведен мой код и связанный файл:

BasicApplication.java

package testproject;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.rap.rwt.application.Application;
import org.eclipse.rap.rwt.application.ApplicationConfiguration;
import org.eclipse.rap.rwt.client.WebClient;

public class BasicApplication implements ApplicationConfiguration {

    public void configure(Application application) {
        Map<String, String> properties = new HashMap<String, String>();
        properties.put(WebClient.PAGE_TITLE, "Test Project");
        application.addEntryPoint("/", BasicEntryPoint.class, properties);
    }

}

BasicEntryPoint.java

package testproject;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files; 
import org.eclipse.rap.rwt.RWT;
import org.eclipse.rap.rwt.application.AbstractEntryPoint;
import org.eclipse.rap.rwt.client.service.UrlLauncher;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;


public class BasicEntryPoint extends AbstractEntryPoint {

    @Override
    protected void createContents(Composite parent) {
        parent.setLayout(new GridLayout(2, false));

        Button downloadButton = new Button(parent, SWT.PUSH);
        downloadButton.setText("Download");
        downloadButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
              try {
                    File testfile = new File("/home/user/Desktop/test.file");
                    byte[] fileContent = Files.readAllBytes(testfile.toPath());
                    sendDownload(fileContent, testfile.getName());
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
              }
            });
      }

    public boolean sendDownload(byte[] data, String filename) {
        DownloadServiceHandler service = new DownloadServiceHandler(data, filename);
        service.register();
        UrlLauncher launcher = RWT.getClient().getService(UrlLauncher.class);
        launcher.openURL(service.getURL());
        return true;
    }

}

DownloadServiceHandler.java

package testproject;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.rap.rwt.RWT;
import org.eclipse.rap.rwt.service.ServiceHandler;

public class DownloadServiceHandler implements ServiceHandler {

    private final byte[] data;
    private final String filename;
    private String id;

    public DownloadServiceHandler(byte[] data, String filename) {
        this.data = data;
        this.filename = filename;
        this.id = calculateId();
    }

    public String getURL() {
        return RWT.getServiceManager().getServiceHandlerUrl(getId());
    }

    private String getId() {
        return id;
    }

    private String calculateId() {
        return String.valueOf(System.currentTimeMillis()) + data.length;
    }

    public boolean register() {
        try {
            RWT.getServiceManager().registerServiceHandler(getId(), this);
            return true;
        } catch (Exception e) {
            System.out.println("failed to register download service handler");
            return false;
        }
    }

    private boolean unregister() {
        try {
            RWT.getServiceManager().unregisterServiceHandler(getId());
            return true;
        } catch (Exception e) {
            System.out.println("failed to unregister download service handler");
            return false;
        }
    }

    @Override
    public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        try {
            response.setContentType("application/octet-stream"); // this is the error line "DownloadServiceHandler.java:59"
            response.setContentLength(data.length);
            response.setHeader("Content-Disposition", "attachment; filename=\"" + filename
                    + "\"");
            response.getOutputStream().write(data);
        } catch (Exception e) {
            System.out.println("failed to dispatch download");
        } finally {
            unregister();
        }
    }

}

META-INF / MANIFEST.MF

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Testproject
Bundle-SymbolicName: testproject
Bundle-Version: 1.0.0.qualifier
Automatic-Module-Name: testproject
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Require-Bundle: org.eclipse.rap.rwt;bundle-version="[3.0.0,4.0.0)"
Service-Component: OSGI-INF/contribution.xml
Import-Package: javax.servlet;version="3.1.0",
 javax.servlet.http;version="3.1.0"
Bundle-ClassPath: .

OSGI-INF / contrib.xml

<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="BasicApplication">
   <implementation class="testproject.BasicApplication"/>
   <service>
      <provide interface="org.eclipse.rap.rwt.application.ApplicationConfiguration"/>
   </service>
</scr:component>

Как мне исправить эту ошибку?Я не знаю, как это работает в Eclipse IDE, но не работает после его развертывания на сервере Tomcat.Заранее спасибо.

1 Ответ

0 голосов
/ 02 марта 2019

Я нашел решение самостоятельно ....

Я ограничил свой проект только с помощью javax.servlet версии 3.1.0.Может быть, версия Tomcat Server, которую я установил, не поддерживается.Я не уверен в этом, но я пересмотрел следующую часть в META-INF / MANIFEST.MF, и проблема была исправлена.

Import-Package: javax.servlet; версия = "[2.3.0, 4.0.0) ", javax.servlet.http; версия =" [2.3.0,4.0.0) "

...