我正在尝试对上传调用进行单元测试,但是我收到以下代码的错误:
@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。
我只使用jetty 8.1.10,正如我在build.sbt中使用的那样:
“org.eclipse.jetty”%“jetty-webapp”%“8.1.10.v20130312”% “容器”
,
答案 0 :(得分:9)
这是我在使用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();
}
}
答案 1 :(得分:8)
如果其他人在Jetty 9中寻找这个:
将此添加到request.handle(...)
MultipartConfigElement multipartConfigElement = new MultipartConfigElement((String)null);
request.setAttribute(Request.__MULTIPART_CONFIG_ELEMENT, multipartConfigElement);
答案 2 :(得分:2)
@MultipartConfig
是Servlet规范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示例项目。