Jersey文档(版本 2.29.1)具有以下示例Example 9.50. Use of @FormDataParam annotation
:
@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
public String postForm(
@DefaultValue("true") @FormDataParam("enabled") boolean enabled,
@FormDataParam("data") FileData bean,
@FormDataParam("file") InputStream file,
@FormDataParam("file") FormDataContentDisposition fileDisposition) {
// ...
}
就我而言,该方法如下所示:
@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Path("/test")
public Response saveFiles(
@FormDataParam("file") InputStream file,
@FormDataParam("file") FormDataContentDisposition fileDisposition
){
return Response.ok().build();
}
启动服务器时(也就是说,它甚至没有到达方法调用),我收到以下错误(我使用的是 Apache Tomcat / 8.5.16):
类型异常报告
servlet [rest.ApplicationConfig] 的消息 Servlet.init() 抛出异常
说明 服务器遇到了阻止它完成请求的意外情况。
例外
javax.servlet.ServletException:Servlet [rest.ApplicationConfig] 的 Servlet.init() 抛出异常 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478) ErrorReportValve.java:80) org.apache.catalina。 Valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:624) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799) org. apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint. java:1455) org.apache.tomcat.util.net.SocketProcessorBase。运行(SocketProcessorBase.java:49)java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)org.apache.tomcat.util。线程.TaskThread$WrappingRunnable.run(TaskThread.java:61) java.lang.Thread.run(Thread.java:748)
根本原因
java.lang.IllegalStateException:资源配置在此上下文中不可修改。org.glassfish.jersey.server.ResourceConfig$ImmutableState.register(ResourceConfig.java:246) org.glassfish.jersey.server.ResourceConfig$ImmutableState.register(ResourceConfig.java:193) org.glassfish.jersey.server.ResourceConfig。 register(ResourceConfig.java:426) org.glassfish.jersey.servlet.WebComponent.(WebComponent.java:306) org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:154) org.glassfish.jersey.servlet .ServletContainer.init(ServletContainer.java:346) javax.servlet.GenericServlet.init(GenericServlet.java:158) org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478) org.apache.catalina.valves .ErrorReportValve.invoke(ErrorReportValve.java:80) org.apache。
注意服务器日志中提供了根本原因的完整堆栈跟踪。
同时,如果去掉@FormDataParam("file") InputStream file
and @FormDataParam("file") FormDataContentDisposition fileDisposition
,则服务器正常启动:
@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Path("/test")
public Response saveFiles(){
return Response.ok().build();
}
服务器本身的配置不使用web.xml
,如果这很重要:
@ApplicationPath("/")
public class ApplicationConfig extends Application {
}
像这样尝试,结果完全一样:
@ApplicationPath("/")
public class ApplicationConfig extends ResourceConfig {
public ApplicationConfig(){
register(MultiPartFeature.class);
}
}
有什么问题以及如何解决?