【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访问不了。
【Java】springboot中@EnableWebMvc的正确使用姿势是什么?

【Java】springboot中@EnableWebMvc的正确使用姿势是什么?

②而关闭@EnableWebMvc注解时,swagger2能访问,文件上传不了,压根就不进入upload方法,抛出org.springframework.web.HttpMediaTypeNotSupportedException异常。
【Java】springboot中@EnableWebMvc的正确使用姿势是什么?

【Java】springboot中@EnableWebMvc的正确使用姿势是什么?

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相关的资源映射
【Java】springboot中@EnableWebMvc的正确使用姿势是什么?

这是swagger-ui.html的位置,在jar里面

这个是swagger-ui.html的映射
【Java】springboot中@EnableWebMvc的正确使用姿势是什么?

以上是 【Java】springboot中@EnableWebMvc的正确使用姿势是什么? 的全部内容, 来源链接: utcz.com/a/89699.html

回到顶部