No multipartconfig for servlet error from Jetty using scalatra

I am trying to execute a unit test call, but I am getting this error for the following code:

@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}") } 

Error:

 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] 

And this is my unit test, and the first succeeds, so it finds my web service:

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

I run this inside Eclipse and I am not sure what is going on.

It works fine using HttpPost and MultipartEntity , so it seems like it's a problem with Eclipse or how the scalatra specification environment works.

Any idea what could be wrong?

I do not have a separate web.xml.

I use only berth 8.1.10, as can be seen from what I use in build.sbt:

"org.eclipse.jetty"% "jetty-webapp"% "8.1.10.v20130312"% "Container"

+6
source share
3 answers

Submit the solution I found when using ServletContextHandler, not WebAppContext. From here: 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(); } } 
+6
source

If someone else is looking for this in Jetty 9:

Add this to request.handle (...)

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

@MultipartConfig is an annotation of the servlet 3.0 specification. You will need to add the appropriate artifacts and settings to support annotations in your Jetty environment.

You will need the jetty-annotations and jetty-plus artifacts.

Then you need to configure the test server with the appropriate configurations.

like this...

(I don’t know the Scala features here, 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(); } } 

This is from the example https://github.com/jetty-project/embedded-servlet-3.0 .

+1
source

Source: https://habr.com/ru/post/950912/


All Articles