springboot开发框架,实现导入excel功能时,出现了异常。
2019-08-20 11:55:00.789 [mro: 14b7e87c71c5a153][http-nio-8003-exec-5] ERROR com.*.*.tools.handler.ExceptionHandler - >>>>>>>>> 全局异常 Content type 'multipart/form-data;boundary=8W9FvXCsB3vQi-8vDdsixqHYDb68OBbo;charset=UTF-8' not supported >>>>>>>>>>>>>>
org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'multipart/form-data;boundary=8W9FvXCsB3vQi-8vDdsixqHYDb68OBbo;charset=UTF-8' not supported
at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:237)
at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:150)
at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:128)
at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121)
at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:158)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:128)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:55)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.filters.RemoteIpFilter.doFilter(RemoteIpFilter.java:865)
at org.apache.catalina.filters.RemoteIpFilter.doFilter(RemoteIpFilter.java:902)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at com.runlion.security.server.filter.UserInfoFilter.doFilter(UserInfoFilter.java:59)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:110)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
springboot开发。
1.代码实现,controller层:
@RequestMapping(value = "/importExcel",method = RequestMethod.POST)
public BaseResultVo uploadExcel(@RequestParam("file") MultipartFile file, @RequestParam("id") Long id) throws Exception {
return checkInventoryService.uploadExcel(file, id);
}
2.使用postman工具测试该导入接口。
点击send,出错。
3. checkInventoryService.uploadExcel(file, id);实现类调用了另一个微服务。
另一个微服务后台抛出上面的异常 :全局异常 Content type 'multipart/form-data;boundary=8W9FvXCsB3vQi-8vDdsixqHYDb68OBbo;charset=UTF-8' not supported >>>>>>>>>>>>>>
@Override
@Transactional(rollbackFor = {CheckException.class, Exception.class})
public void updateCheckStatus(CheckInventory checkInventory) throws Exception {
/todo
List<Long> locationIds = checkInventoryDetailDao.selectFinished(checkInventory.getId());
if (!CollectionUtils.isEmpty(locationIds)) {
LocationDTO locationDTO = new LocationDTO();
locationDTO.setLocationIds(locationIds);
locationDTO.setState(locationEnum.StateEnum.yes.getId());
BaseResultVo resultVo = locationApi.updateStatus(locationDTO);//1.这里报异常
if (IntegerUtil.notEqualTo(BaseResultVo.SUCCESS_CODE, resultVo.getStatus())) {
throw new CheckException(CheckException.CheckPlanExceptionEnum.fail_update_location.getValue(),
CheckException.CheckPlanExceptionEnum.fail_update_location.getId());
}
}
/// todo
}
feign接口:
@FeignClient("sat-oms")
public interface LocationApi {
/**
* 修改库位状态
* @param dto
* @return
*/
@RequestMapping(value = "/api/location/updateStatus",method = RequestMethod.POST)
BaseResultVo updateStatus(@RequestBody LocationDTO dto);
@GetMapping(value = "/api/location/queryByCode")
LocationVO queryByCode(@RequestParam(name = "warehouseId") Long warehouseId,
@RequestParam(name = "areaCode", defaultValue = "") String areaCode,
@RequestParam(name = "reservoirAreaCode", defaultValue = "") String reservoirAreaCode,
@RequestParam(name = "shelfOrder", defaultValue = "") String shelfOrder);
@GetMapping(value = "/api/location/update1Status")
BaseResultVo update1Status(@RequestParam(name = "locationIds", defaultValue = "") String locationIds);
}
feign实现:
@Slf4j
@RestController
public class LocationApiImpl implements LocationApi {
@Override
public BaseResultVo updateStatus(@RequestBody LocationDTO dto) {
try{
return locationService.updateStatus(dto);
}catch(Exception e){
log.error("系统异常",e);
return BaseResultVo.error();
}
}
@Override
public LocationVO queryByCode(@RequestParam(name = "warehouseId") Long warehouseId,
@RequestParam(name = "areaCode", defaultValue = "") String areaCode,
@RequestParam(name = "reservoirAreaCode", defaultValue = "") String reservoirAreaCode,
@RequestParam(name = "shelfOrder", defaultValue = "") String shelfOrder) {
LocationSearchDTO locationSearchDTO = new LocationSearchDTO();
locationSearchDTO.setWarehouseId(warehouseId);
locationSearchDTO.setAreaCode(areaCode);
locationSearchDTO.setReservoirAreaCode(reservoirAreaCode);
locationSearchDTO.setShelfOrder(shelfOrder);
return locationDao.queryByCode(locationSearchDTO);
}
@Override
public BaseResultVo update1Status(@RequestParam(name = "locationIds", defaultValue = "") String locationIds) {
try{
LocationDTO dto = new LocationDTO();
dto.setState(1);
dto.setLocationIds(JSONArray.parseArray(locationIds, Long.class));
return locationService.updateStatus(dto);
}catch(Exception e){
log.error("系统异常",e);
return BaseResultVo.error();
}
}
}
需要将
BaseResultVo resultVo = locationApi.updateStatus(locationDTO);
改成
BaseResultVo resultVo = locationApi.update1Status(JSONArray.toJSONString(locationIds));
就OK!
4. 总结
具体原理尚不清楚。