2013-08-02 6 views
6

ich Einheit versuche einen Upload Anruf testen, aber ich bekomme diese Fehlermeldung für den folgenden Code:Kein multipartconfig für Servlet Fehler von Jetty mit 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}") 
    } 

Der Fehler ist:

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] 

Und das ist mein Komponententest, und der erste ist erfolgreich, so dass es meinen Webservice findet:

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 
     } 
    } 
    } 
} 

Ich renne thi s in Eclipse und ich bin mir nicht sicher, was passiert.

Es funktioniert gut mit HttpPost und MultipartEntity so scheint es ein Problem mit Eclipse oder wie die Scalatraspezifikation Framework funktioniert.

Irgendeine Idee was schief gehen könnte?

Ich habe keine separate web.xml.

ich nur mit am Anlegesteg 8.1.10, wie man sehen, was ich in build.sbt verwenden:

"org.eclipse.jetty" % "Anlegesteg-Webapp" % „8.1.10.v20130312 "% "Behälter"

,

Antwort

6

Veröffentlichen Sie die Lösung, die ich gefunden habe, wenn Sie ServletContextHandler und nicht WebAppContext verwenden. Von hier aus: 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(); 
    } 
} 
1

Die @MultipartConfig ist ein Servlet spec 3.0 Annotation. Sie müssen die entsprechenden Artefakte und Konfigurationen hinzufügen, um die Annotation in Ihrer Jetty-Umgebung zu unterstützen.

Sie werden die jetty-annotations und jetty-plus Artefakte wollen.

Dann sollten Sie den Testserver mit den entsprechenden Konfigurationen einrichten.

so ...

(ich weiß nicht, die Scala Besonderheiten hier, sorry)

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(); 
    } 
} 

Dies ist aus dem https://github.com/jetty-project/embedded-servlet-3.0 Beispielprojekt.

+0

Danke. Wie ich bereits erwähnt habe, funktioniert es gut, wenn ich es von sbt (simple build tool) starte, wie ich feststellen kann, wenn ich einen Junit-Test verwende, der auf den Webserver geht. Aber, wenn ich versuche, specs2 zu verwenden, und ich nehme an, dass es wegen der Ausführung in Eclipse ist, ist es nicht. Ich möchte keine Änderungen am Programm für diesen Komponententest vornehmen, sondern verstehen, warum es nicht funktioniert. –

5

Falls jemand anderes sucht diese in Jetty 9:

Fügen Sie diese auf der request.handle (...)

MultipartConfigElement multipartConfigElement = new MultipartConfigElement((String)null); 
request.setAttribute(Request.__MULTIPART_CONFIG_ELEMENT, multipartConfigElement); 
+0

dies für mich nicht einmal kompilieren, __MULTIPART_CONFIG_ELEMENT ist unbekannt Feld – SRedouane

+0

I Ich habe dies als meine Anlegesteg Version gerade überprüft (:) ich auch auf dem interwebs veraltete Sachen hasse): '' ' \t \t org.eclipse.jetty \t \t Anlegesteg-Server \t \t 9.3.8.v20160314 \t '' ' – Richard

Verwandte Themen