【Java】springboot中@EnableWebMvc的正确使用姿势是什么?
1.描述
我用springboot整合了swagger,同时又做了文件上传的功能。代码如下(代码功能没有问题,已测试过):
//文件上传@Api(value = "文件上传", description = "文件上传API")
@RestController
public class UploadController {
@Autowired
private FileUploadService fileUploadService;
@ApiOperation(value = "文件上传", notes = "文件上传")
@RequestMapping(value = "/api/upload", method = RequestMethod.POST, consumes = "multipart/form-data")
public RestResult upload(@RequestParam MultipartFile file) {
String fileFullPath = fileUploadService.upload(file);
return RestResultGenerator.getSuccessResult(fileFullPath);
}
}
//swagger2配置
@ConditionalOnProperty(prefix = "swagger2", value = {"enable"}, havingValue = "1")
@EnableSwagger2
@Configuration
public class Swagger2Config {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.freedom.clothing.controller"))
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("Restful API列表")
.contact(new Contact("xx", "", ""))
.version("1.0")
.description("")
.build();
}
}
//DisPatcherServlet配置
@Configuration
@EnableWebMvc//(【开启,会拦截swagger2页面】【不开启,文件上传不了】)
public class WebMVCConfig extends WebMvcConfigurerAdapter {
@Bean
public CommonsMultipartResolver multipartResolver() {
CommonsMultipartResolver resolver = new CommonsMultipartResolver();
resolver.setDefaultEncoding("utf-8");
resolver.setMaxInMemorySize(40960);
resolver.setMaxUploadSize(10485760);
return resolver;
}
}
2.我遇到的问题
①但是,当我开启@EnableWebMvc注解时,文件能够上传,但是swagger2访问不了。
②而关闭@EnableWebMvc注解时,swagger2能访问,文件上传不了,压根就不进入upload方法,抛出org.springframework.web.HttpMediaTypeNotSupportedException异常。
3.我想问的问题
我排查到这个原因花了很长时间,之前一直以为是上传哪里出了问题。
我的思考:
上面加@EnableWebMvc时,显然swagger的静态资源被拦截了,不加@EnableWebMvc就不拦截。
①不都是设置的DispatcherServlet吗,两种情况的mapping映射不同吗?
②@EnableWebMvc到底起什么作用?为什么有时加或不加貌似都没什么影响(应该跟springboot的@EnableAutoConfiguration没什么关系吧,我没开启这个注解)?
回答
开启@EnableWebMvc时,加入以下代码,让DispatcherServlet不拦截swagger的静态资源就行了。
/** * 过滤Swagger2的静态资源
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("swagger-ui.html")
.addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
}
至于@EnableWebMvc到底做了些什么事情,我还没搞清楚。
建议把启动日志中的mapping打印出来
这两个是swagger相关的资源映射
这是swagger-ui.html的位置,在jar里面
这个是swagger-ui.html的映射
以上是 【Java】springboot中@EnableWebMvc的正确使用姿势是什么? 的全部内容, 来源链接: utcz.com/a/89699.html