Нет multipartconfig для ошибки сервлета от Jetty с использованием scalatra

Я пытаюсь выполнить модульное тестирование вызова загрузки, но получаю эту ошибку для следующего кода:

@MultipartConfig(maxFileSize = 3145728)
class WebServlet extends ScalatraServlet with FileUploadSupport {
  override def isSizeConstraintException(e: Exception) = e match {
    case se: ServletException if se.getMessage.contains("exceeds max filesize") ||
      se.getMessage.startsWith("Request exceeds maxRequestSize") => true
    case _ => false
  }
  error {
    case e: SizeConstraintExceededException => RequestEntityTooLarge("too much!")
  }
  post("/uploadscript") {
    val privateParam = try {params("private") != null && params("private").equals("true") } catch { case _ => false }
    println("privateParam = " + privateParam)
    val file = fileParams("file")
    println(s"The size of the file is ${file.size}")
  }

Ошибка:

java.lang.IllegalStateException: No multipart config for servlet
    at org.eclipse.jetty.server.Request.getParts(Request.java:2064) ~[jetty-server-8.1.10.v20130312.jar:8.1.10.v20130312]
    at org.scalatra.servlet.FileUploadSupport$class.getParts(FileUploadSupport.scala:133) ~[scalatra_2.10-2.2.1.jar:2.2.1]
    at org.scalatra.servlet.FileUploadSupport$class.extractMultipartParams(FileUploadSupport.scala:108) ~[scalatra_2.10-2.2.1.jar:2.2.1]
    at org.scalatra.servlet.FileUploadSupport$class.handle(FileUploadSupport.scala:79) ~[scalatra_2.10-2.2.1.jar:2.2.1]
    at com.ui.WebServlet.handle(WebServlet.scala:32) ~[classes/:na]

И это мой модульный тест, и первый из них прошел успешно, поэтому он находит мой веб-сервис:

class WebServletSpecification extends MutableScalatraSpec {
  addServlet(classOf[WebServlet], "/*")

  "GET /hello" should {
    "return status 200" in {
      get("/hello/testcomputer") {
        status must_== 200
      }
    }
  }
  "POST /uploadscript" should {
    "return status 200" in {
    val scriptfile = "testfile"
    val scriptname = "basescript"
      post("/uploadscript", Map("private" -> "true"), Map("file" -> new File(scriptfile))) {
        status must_== 200
      }
    }
  }
}

Я запускаю это внутри Eclipse, и я не уверен, что происходит.

Он отлично работает с использованием HttpPost и MultipartEntity, поэтому, похоже, это проблема с Eclipse или с тем, как работает структура спецификации scalatra.

Есть идеи, что может пойти не так?

У меня нет отдельного web.xml.

Я использую только причал 8.1.10, как видно из того, что я использую в build.sbt:

"org.eclipse.jetty" % "jetty-webapp" % "8.1.10.v20130312" % "контейнер"

,


person James Black    schedule 02.08.2013    source источник


Ответы (3)


Это решение, которое я нашел при использовании ServletContextHandler, а не WebAppContext. Отсюда: https://bugs.eclipse.org/bugs/show_bug.cgi?id=395000

import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.HandlerList;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import javax.servlet.MultipartConfigElement;

public class WebServer {

    protected Server server;

    public static void main(String[] args) throws Exception {
        int port = 8080;
        Server server = new Server(port);

        ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
        context.setContextPath("/");


        ServletHolder fileUploadServletHolder = new ServletHolder(new FileUploadServlet());
        fileUploadServletHolder.getRegistration().setMultipartConfig(new MultipartConfigElement("data/tmp"));
        context.addServlet(fileUploadServletHolder, "/fileUpload");

        server.setHandler(context);
        server.start();
        server.join();
    }
}
person Quentin    schedule 19.09.2014

На случай, если кто-то еще ищет это в Jetty 9:

Добавьте это в request.handle( ... )

MultipartConfigElement multipartConfigElement = new MultipartConfigElement((String)null);
request.setAttribute(Request.__MULTIPART_CONFIG_ELEMENT, multipartConfigElement);
person Richard    schedule 07.04.2016
comment
это даже не компилируется для меня, __MULTIPART_CONFIG_ELEMENT - неизвестное поле - person SRedouane; 20.03.2017
comment
Я только что проверил (я тоже ненавижу устаревшие вещи в Интернете :)) У меня есть эта версия для причала: <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-server</artifactId> <version>9.3.8.v20160314</version> </dependency> - person Richard; 26.03.2017
comment
Для компиляции Request является org.eclipse.jetty.server.Request в 9.2 (для меня это не решило проблему, теперь я получаю java.io.IOException: Incomplete parts) - person Terry Horner; 19.06.2018
comment
спасибо, это работает как шарм после обновления причала с 8.4 до 9.2. - person Vincent Gerris; 01.08.2019

@MultipartConfig — это аннотация спецификации сервлета 3.0. Вам потребуется добавить соответствующие артефакты и конфигурацию для поддержки аннотаций в вашей среде Jetty.

Вам понадобятся артефакты jetty-annotations и jetty-plus.

Затем вы захотите настроить тестовый сервер с соответствующими конфигурациями.

как это...

(Извините, я не знаю особенностей Scala здесь)

package com.company.foo;

import org.eclipse.jetty.annotations.AnnotationConfiguration;
import org.eclipse.jetty.plus.webapp.EnvConfiguration;
import org.eclipse.jetty.plus.webapp.PlusConfiguration;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.webapp.Configuration;
import org.eclipse.jetty.webapp.FragmentConfiguration;
import org.eclipse.jetty.webapp.MetaInfConfiguration;
import org.eclipse.jetty.webapp.TagLibConfiguration;
import org.eclipse.jetty.webapp.WebAppContext;
import org.eclipse.jetty.webapp.WebInfConfiguration;
import org.eclipse.jetty.webapp.WebXmlConfiguration;

public class EmbedMe {
    public static void main(String[] args) throws Exception {
        int port = 8080;
        Server server = new Server(port);

        String wardir = "target/sample-webapp-1-SNAPSHOT";

        WebAppContext context = new WebAppContext();
        context.setResourceBase(wardir);
        context.setDescriptor(wardir + "WEB-INF/web.xml");
        context.setConfigurations(new Configuration[] {
                new AnnotationConfiguration(), new WebXmlConfiguration(),
                new WebInfConfiguration(), new TagLibConfiguration(),
                new PlusConfiguration(), new MetaInfConfiguration(),
                new FragmentConfiguration(), new EnvConfiguration() });

        context.setContextPath("/");
        context.setParentLoaderPriority(true);
        server.setHandler(context);
        server.start();
        server.join();
    }
}

Это из https://github.com/jetty-project/embedded-servlet-3.0 пример проекта.

person Joakim Erdfelt    schedule 02.08.2013
comment
Спасибо. Как я уже упоминал, когда я запускаю его из sbt (простой инструмент сборки), он работает нормально, как я могу сказать, когда я использую тест junit, который идет на веб-сервер. Но когда я пытаюсь использовать spec2 и предполагаю, что это связано с работой в Eclipse, это не так. Я не столько хочу вносить изменения в программу для этого модульного теста, сколько хочу понять, почему он не работает. - person James Black; 03.08.2013