上传文件时 java 休息服务上的 415 不支持的媒体类型
415 Unsupported media type on java rest service when uploading file
我正在尝试建立一个休息服务来上传文件。这是我得到的。当我在 postman 中进行测试时,我选择了表单数据并将 "file" 设置为我正在上传的文件。
@POST
@Path("/upload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response upload(@RequestParam("file") MultipartFile file)
我的理解是我需要 jersey-media-multipart 依赖项
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-multipart</artifactId>
<version>2.25.1</version>
</dependency>
当我尝试发出 post 请求时,出现 415 Unsupported Media Type 错误,我不确定原因。设置为消费MULTIPART_FORM_DATA,参数为MultipartFile.
编辑 我添加了如下配置,
@Configuration
public class JerseyConfig extends ResourceConfig {
public JerseyConfig() {
register(MultiPartFeature.class);
}
}
我也修复了我的资源
@POST
@Path("/upload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response upload(
@FormDataParam("file") InputStream file,
@FormDataParam("file") FormDataContentDisposition fdcd,
@FormDataParam("file-detail") String fileDetail) throws IOException {
现在我得到 [[FATAL] No injection source found for a parameter of type public javax.ws.rs.core.Response
这是我的 spring 引导 class,其中包含其他配置
@SpringBootApplication
@EnableCircuitBreaker
@EntityScan("com.whatever.")
@ImportResource({"classpath*:/META-INF/**/spring-bootstrap.xml"})
@Import({JerseyConfig.class})
@EnableJpaRepositories(basePackages="whatever", entityManagerFactoryRef="entityManagerFactory")
public class Application {
protected TomcatEmbeddedServletContainerFactory createTomcatEmbeddedServletContainerFactory() {
return new TomcatEmbeddedServletContainerFactory() {
@Override
protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(Tomcat tomcat) {
((StandardHost) tomcat.getHost()).setErrorReportValveClass(StringUtils.EMPTY);
return super.getTomcatEmbeddedServletContainer(tomcat);
}
};
}
@Bean
public FilterRegistrationBean requestContextFilter() {
FilterRegistrationBean filterRegistration = new FilterRegistrationBean(new org.springframework.web.filter.RequestContextFilter());
filterRegistration.setName("RequestContextFilter");
filterRegistration.setOrder(Ordered.HIGHEST_PRECEDENCE + 1);
filterRegistration.addUrlPatterns(BASE_PATH + "*");
return filterRegistration;
}
@Bean
public FilterRegistrationBean springSecurityFilterChain() {
FilterRegistrationBean filterRegistration = new FilterRegistrationBean(new org.springframework.web.filter.DelegatingFilterProxy());
filterRegistration.setName("SpringSecurityFilterChain");
filterRegistration.setOrder(Ordered.HIGHEST_PRECEDENCE + 2);
filterRegistration.addUrlPatterns(BASE_PATH + "*");
return filterRegistration;
}
@Bean
@Conditional(NonWindowsCondition.class)
public FilterRegistrationBean f5Filter() {
FilterRegistrationBean filterRegistration = new FilterRegistrationBean(new F5Filter());
filterRegistration.setName("F5Filter");
filterRegistration.setOrder(Ordered.HIGHEST_PRECEDENCE + 3);
filterRegistration.addUrlPatterns(BASE_PATH + "*");
return filterRegistration;
}
/**
* Initializes and registers the JAX-RS filter implementation, currently Jersey.
*
* @return The JAX-RS filter registration.
* @throws ClassNotFoundException
* @throws IllegalAccessException
* @throws InstantiationException
*/
@Bean
public FilterRegistrationBean jaxrsFilter() throws InstantiationException, IllegalAccessException, ClassNotFoundException {
Filter filter = (Filter) Class.forName("org.glassfish.jersey.servlet.ServletContainer").newInstance();
jerseyFilterRegistration.setFilter(filter);
jerseyFilterRegistration.setName("JerseyFilter");
jerseyFilterRegistration.setDispatcherTypes(EnumSet.allOf(DispatcherType.class));
// Set the Jersey filter mapping and context path
jerseyFilterRegistration.addUrlPatterns(BASE_PATH + "*");
jerseyFilterRegistration.addInitParameter("jersey.config.servlet.filter.contextPath", BASE_PATH);
// Load the common package and application package
jerseyFilterRegistration.addInitParameter("jersey.config.server.provider.packages", "com.whatever.jaxrs.feature;com.whatever.fig.risk.webservice.resource");
// Enable media type mappings on the URI such as .xml and .json
jerseyFilterRegistration.addInitParameter("jersey.config.server.mediaTypeMappings", "xml:application/xml, json:application/json");
// Enable Java bean validation integration
jerseyFilterRegistration.addInitParameter("jersey.config.beanValidation.enableOutputValidationErrorEntity.servers", "true");
// Disable the application.wadl from being generated and publicly visible (ITSO finding)
jerseyFilterRegistration.addInitParameter("jersey.config.server.wadl.disableWadl", "true");
// Forward 404s to Spring MVC, which serves up the Actuator endpoints and non-jersey resources
jerseyFilterRegistration.addInitParameter("jersey.config.servlet.filter.forwardOn404", "true");
if (isJerseyDebug) {
// Debug parameter switches
jerseyFilterRegistration.addInitParameter("jersey.config.server.monitoring.statistics.enabled", "true");
jerseyFilterRegistration.addInitParameter("jersey.config.server.tracing.type", "ALL");
jerseyFilterRegistration.addInitParameter("jersey.config.server.tracing.threshold", "VERBOSE");
}
return jerseyFilterRegistration;
}
@RequestParam
和 MultipartFile
都是 Spring 而不是泽西岛的东西。对于 Jersey,您要使用的是注释 @FormDataParam
,对于参数,根据部件类型,您可以使用许多不同类型的参数。如果该部分是一个文件,您可以使用 InputStream
、File
或 byte[]
参数,或者如果该部分是一些纯文本,您可以使用 String 参数。如果需要文件名,可以 添加 一个 FormDataContentDisposition
参数以及零件实体参数。下面是一个例子
@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response upload(
@FormDataParam("file") InputStream file,
@FormDataParam("file") FormDataContentDisposition fdcd,
@FormDataParam("file-detail") String fileDetail) {
}
要完成这项工作,您需要在您的应用程序中注册 MultiPartFeature
。您可以查看 了解注册方法。
另请参阅:
- File upload along with other object in Jersey restful web service
- Jersey documentation for Multipart support
我正在尝试建立一个休息服务来上传文件。这是我得到的。当我在 postman 中进行测试时,我选择了表单数据并将 "file" 设置为我正在上传的文件。
@POST
@Path("/upload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response upload(@RequestParam("file") MultipartFile file)
我的理解是我需要 jersey-media-multipart 依赖项
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-multipart</artifactId>
<version>2.25.1</version>
</dependency>
当我尝试发出 post 请求时,出现 415 Unsupported Media Type 错误,我不确定原因。设置为消费MULTIPART_FORM_DATA,参数为MultipartFile.
编辑 我添加了如下配置,
@Configuration
public class JerseyConfig extends ResourceConfig {
public JerseyConfig() {
register(MultiPartFeature.class);
}
}
我也修复了我的资源
@POST
@Path("/upload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response upload(
@FormDataParam("file") InputStream file,
@FormDataParam("file") FormDataContentDisposition fdcd,
@FormDataParam("file-detail") String fileDetail) throws IOException {
现在我得到 [[FATAL] No injection source found for a parameter of type public javax.ws.rs.core.Response
这是我的 spring 引导 class,其中包含其他配置
@SpringBootApplication
@EnableCircuitBreaker
@EntityScan("com.whatever.")
@ImportResource({"classpath*:/META-INF/**/spring-bootstrap.xml"})
@Import({JerseyConfig.class})
@EnableJpaRepositories(basePackages="whatever", entityManagerFactoryRef="entityManagerFactory")
public class Application {
protected TomcatEmbeddedServletContainerFactory createTomcatEmbeddedServletContainerFactory() {
return new TomcatEmbeddedServletContainerFactory() {
@Override
protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(Tomcat tomcat) {
((StandardHost) tomcat.getHost()).setErrorReportValveClass(StringUtils.EMPTY);
return super.getTomcatEmbeddedServletContainer(tomcat);
}
};
}
@Bean
public FilterRegistrationBean requestContextFilter() {
FilterRegistrationBean filterRegistration = new FilterRegistrationBean(new org.springframework.web.filter.RequestContextFilter());
filterRegistration.setName("RequestContextFilter");
filterRegistration.setOrder(Ordered.HIGHEST_PRECEDENCE + 1);
filterRegistration.addUrlPatterns(BASE_PATH + "*");
return filterRegistration;
}
@Bean
public FilterRegistrationBean springSecurityFilterChain() {
FilterRegistrationBean filterRegistration = new FilterRegistrationBean(new org.springframework.web.filter.DelegatingFilterProxy());
filterRegistration.setName("SpringSecurityFilterChain");
filterRegistration.setOrder(Ordered.HIGHEST_PRECEDENCE + 2);
filterRegistration.addUrlPatterns(BASE_PATH + "*");
return filterRegistration;
}
@Bean
@Conditional(NonWindowsCondition.class)
public FilterRegistrationBean f5Filter() {
FilterRegistrationBean filterRegistration = new FilterRegistrationBean(new F5Filter());
filterRegistration.setName("F5Filter");
filterRegistration.setOrder(Ordered.HIGHEST_PRECEDENCE + 3);
filterRegistration.addUrlPatterns(BASE_PATH + "*");
return filterRegistration;
}
/**
* Initializes and registers the JAX-RS filter implementation, currently Jersey.
*
* @return The JAX-RS filter registration.
* @throws ClassNotFoundException
* @throws IllegalAccessException
* @throws InstantiationException
*/
@Bean
public FilterRegistrationBean jaxrsFilter() throws InstantiationException, IllegalAccessException, ClassNotFoundException {
Filter filter = (Filter) Class.forName("org.glassfish.jersey.servlet.ServletContainer").newInstance();
jerseyFilterRegistration.setFilter(filter);
jerseyFilterRegistration.setName("JerseyFilter");
jerseyFilterRegistration.setDispatcherTypes(EnumSet.allOf(DispatcherType.class));
// Set the Jersey filter mapping and context path
jerseyFilterRegistration.addUrlPatterns(BASE_PATH + "*");
jerseyFilterRegistration.addInitParameter("jersey.config.servlet.filter.contextPath", BASE_PATH);
// Load the common package and application package
jerseyFilterRegistration.addInitParameter("jersey.config.server.provider.packages", "com.whatever.jaxrs.feature;com.whatever.fig.risk.webservice.resource");
// Enable media type mappings on the URI such as .xml and .json
jerseyFilterRegistration.addInitParameter("jersey.config.server.mediaTypeMappings", "xml:application/xml, json:application/json");
// Enable Java bean validation integration
jerseyFilterRegistration.addInitParameter("jersey.config.beanValidation.enableOutputValidationErrorEntity.servers", "true");
// Disable the application.wadl from being generated and publicly visible (ITSO finding)
jerseyFilterRegistration.addInitParameter("jersey.config.server.wadl.disableWadl", "true");
// Forward 404s to Spring MVC, which serves up the Actuator endpoints and non-jersey resources
jerseyFilterRegistration.addInitParameter("jersey.config.servlet.filter.forwardOn404", "true");
if (isJerseyDebug) {
// Debug parameter switches
jerseyFilterRegistration.addInitParameter("jersey.config.server.monitoring.statistics.enabled", "true");
jerseyFilterRegistration.addInitParameter("jersey.config.server.tracing.type", "ALL");
jerseyFilterRegistration.addInitParameter("jersey.config.server.tracing.threshold", "VERBOSE");
}
return jerseyFilterRegistration;
}
@RequestParam
和 MultipartFile
都是 Spring 而不是泽西岛的东西。对于 Jersey,您要使用的是注释 @FormDataParam
,对于参数,根据部件类型,您可以使用许多不同类型的参数。如果该部分是一个文件,您可以使用 InputStream
、File
或 byte[]
参数,或者如果该部分是一些纯文本,您可以使用 String 参数。如果需要文件名,可以 添加 一个 FormDataContentDisposition
参数以及零件实体参数。下面是一个例子
@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response upload(
@FormDataParam("file") InputStream file,
@FormDataParam("file") FormDataContentDisposition fdcd,
@FormDataParam("file-detail") String fileDetail) {
}
要完成这项工作,您需要在您的应用程序中注册 MultiPartFeature
。您可以查看
另请参阅:
- File upload along with other object in Jersey restful web service
- Jersey documentation for Multipart support