SpringFramework Boot 在其他 servlet 读取之前读取输入流
SpringFramework Boot reads input stream before other servlet can read it
我有一个由 jsps 和 servlet 组成的现有 Web 应用程序,我正在尝试将 SpringFramework Boot 添加到其中,以便我可以向该应用程序添加一些新的简单休息服务。这些休息服务通过 jackson-databind 接受和 return JSON。
这样做的问题是,读取上传文件的现有 servlet 的请求输入流现在在被调用之前已被消耗,因此文件不存在。
使用 maven 我已将以下内容添加到我的 pom.xml...
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.4.4</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>1.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<version>1.2.1.RELEASE</version>
<scope>provided</scope>
</dependency>
... 我添加了以下 RestApplication class ...
@Configuration
@EnableAutoConfiguration
@ComponentScan
public class RestApplication extends SpringBootServletInitializer {
public static void main(final String[] args) {
SpringApplication.run(RestApplication.class, args);
}
@Override
protected final SpringApplicationBuilder configure(final SpringApplicationBuilder application) {
return application.sources(RestApplication.class);
}
}
...和以下控制器class ...
@RestController
@RequestMapping(value = "/obj/mycontroller")
public class MyController
{
@RequestMapping(value = "/save", method = RequestMethod.POST)
public long save(final HttpServletRequest request,
final MyObject thing)
{
// save the thing
}
}
... 一切正常,但是 现在我的文件上传标准 servlet 已损坏。它仍然被调用,但它的输入流似乎是空的,因此找不到任何文件。这是该 servlet 的定义...
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
@MultipartConfig
public class MediaUploadServlet
extends HttpServlet
{
protected void doPost(final HttpServletRequest request,
final HttpServletResponse response)
throws ServletException, IOException
{
if (ServletFileUpload.isMultipartContent(request)) {
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
try {
List<FileItem> items = upload.parseRequest(request);
// do stuff with the files.
} catch (FileUploadException ex) {
// handle error
}
}
}
}
...现在项目是空的。
如果我去掉 @EnableAutoConfiguration 标签,那么 MediaUploadServlet 会再次工作,但 MyController 不会。所以我的问题是,如何将 Spring 引导配置为 only 在 MyController 上是神奇的还是 not 在 MediaUploadServlet 上是神奇的?
在 RestApplication 中通过 bean 注册 servlet 需要做什么 class
@Bean
public ServletRegistrationBean servletRegistrationBean(){
return new ServletRegistrationBean(new MediaUploadServlet(),"/mediaupload");
}
我有一个由 jsps 和 servlet 组成的现有 Web 应用程序,我正在尝试将 SpringFramework Boot 添加到其中,以便我可以向该应用程序添加一些新的简单休息服务。这些休息服务通过 jackson-databind 接受和 return JSON。
这样做的问题是,读取上传文件的现有 servlet 的请求输入流现在在被调用之前已被消耗,因此文件不存在。
使用 maven 我已将以下内容添加到我的 pom.xml...
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.4.4</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>1.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<version>1.2.1.RELEASE</version>
<scope>provided</scope>
</dependency>
... 我添加了以下 RestApplication class ...
@Configuration
@EnableAutoConfiguration
@ComponentScan
public class RestApplication extends SpringBootServletInitializer {
public static void main(final String[] args) {
SpringApplication.run(RestApplication.class, args);
}
@Override
protected final SpringApplicationBuilder configure(final SpringApplicationBuilder application) {
return application.sources(RestApplication.class);
}
}
...和以下控制器class ...
@RestController
@RequestMapping(value = "/obj/mycontroller")
public class MyController
{
@RequestMapping(value = "/save", method = RequestMethod.POST)
public long save(final HttpServletRequest request,
final MyObject thing)
{
// save the thing
}
}
... 一切正常,但是 现在我的文件上传标准 servlet 已损坏。它仍然被调用,但它的输入流似乎是空的,因此找不到任何文件。这是该 servlet 的定义...
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
@MultipartConfig
public class MediaUploadServlet
extends HttpServlet
{
protected void doPost(final HttpServletRequest request,
final HttpServletResponse response)
throws ServletException, IOException
{
if (ServletFileUpload.isMultipartContent(request)) {
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
try {
List<FileItem> items = upload.parseRequest(request);
// do stuff with the files.
} catch (FileUploadException ex) {
// handle error
}
}
}
}
...现在项目是空的。
如果我去掉 @EnableAutoConfiguration 标签,那么 MediaUploadServlet 会再次工作,但 MyController 不会。所以我的问题是,如何将 Spring 引导配置为 only 在 MyController 上是神奇的还是 not 在 MediaUploadServlet 上是神奇的?
在 RestApplication 中通过 bean 注册 servlet 需要做什么 class
@Bean
public ServletRegistrationBean servletRegistrationBean(){
return new ServletRegistrationBean(new MediaUploadServlet(),"/mediaupload");
}