2013-08-02 13 views
6

Sto cercando di unità di prova una chiamata di upload, ma ottengo questo errore per il seguente codice:No multipartconfig di errore servlet dal molo utilizzando 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}") 
    } 

L'errore è:

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] 

E questo è il mio test di unità, e il primo ha successo, quindi è trovare il mio webservice:

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

sono in esecuzione thi s all'interno di Eclipse e non sono sicuro di cosa stia succedendo.

Funziona perfettamente con l'utilizzo di HttpPost e MultipartEntity, quindi sembra che si tratti di un problema con Eclipse o di come funziona il framework di specifiche scalatra.

Qualche idea di cosa potrebbe andare storto?

Non ho un file web.xml separato.

Io uso solo pontile 8.1.10, come visto da quello che io uso in build.sbt:

"org.eclipse.jetty" % "pontile-webapp" % "8.1.10.v20130312 "% "contenitore"

,

risposta

6

Posta la soluzione che ho trovato usando ServletContextHandler e non WebAppContext. Da qui: 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

Il @MultipartConfig è una Servlet 3.0 spec annotazione. È necessario aggiungere le risorse utente e la configurazione appropriate per supportare l'annotazione nel proprio ambiente Jetty.

Avrai bisogno degli artefatti jetty-annotations e jetty-plus.

Quindi è necessario configurare il server di prova con le configurazioni appropriate.

come questo ...

(non so le specifiche Scala qui, mi spiace)

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

Questo è dal progetto https://github.com/jetty-project/embedded-servlet-3.0 esempio.

+0

Grazie. Come ho detto, quando lo avvio da sbt (semplice strumento di costruzione) funziona bene, come posso dire quando uso un test di junit che va al server web. Ma, quando provo a usare specs2, e presumo che sia dovuto a funzionare in Eclipse, non lo è. Non voglio apportare modifiche al programma per questo test unitario tanto quanto capire perché non funziona. –

5

Nel caso in cui qualcun altro è alla ricerca di questo Jetty 9:

Aggiungere questo al request.handle (...)

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

questo non ha nemmeno compilare per me, __MULTIPART_CONFIG_ELEMENT è sconosciuto campo – SRedouane

+0

Ho appena controllato (io odio roba superata sull'interwebs troppo :)) ho questo come la mia versione molo: '' ' \t \t org.eclipse.jetty \t \t molo server \t \t 9.3.8.v20160314 \t '' ' – Richard

Problemi correlati