GVKun编程网logo

导出excel报错:No converter for [class xxx] with preset Content-Type 'application/vnd.openxmlformats

31

在本文中,我们将带你了解导出excel报错:Noconverterfor[classxxx]withpresetContent-Type'application/vnd.openxmlfor

在本文中,我们将带你了解导出excel报错:No converter for [class xxx] with preset Content-Type 'application/vnd.openxmlformats在这篇文章中,同时我们还将给您一些技巧,以帮助您实现更有效的(HttpMessageNotWritableException ) No converter found for return value of type xxxx、@JsonProperty无法用于Content-Type:application / x-www-form-urlencoded、application.properties提示Cannot resolve configuration property ''xxxx''、applicationContext-common.xml]; nested exception is java.lang.NoClassDefFoundError: org/w3c/dom/E...

本文目录一览:

导出excel报错:No converter for [class xxx] with preset Content-Type 'application/vnd.openxmlformats

导出excel报错:No converter for [class xxx] with preset Content-Type 'application/vnd.openxmlformats

org.springframework.http.converter.HttpMessageNotWritableException: No converter for [class xxx] with preset Content-Type ''application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8''

先说解决方法

解决方法有两种:

第一种:把接口返回值改为void。

第二种:用response.reset()置空返回值里的ContentType,让处理器自己选择合适的ContentType来转换返回值,不过这样的话返回给前端的ContentType也为空,前端就没法根据ContentType来判断文件的格式,需要前端自行设置文件格式。


问题代码

问题现象为导出功能可以正常使用,但日志里会报错“无法转换返回值”,这报错虽然不影响使用,但看着总是很不顺眼的嘛。

public MessageResp<String> exportExcel(@RequestBody Req req, HttpServletResponse response) throws Exception {
try (ServletoutputStream out = response.getoutputStream()) {
     String fileName = URLEncoder.encode("导出表格.xlsx", "UTF-8");
     response.reset();
     response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
     response.setHeader("Content-disposition", "attachment;filename=" + fileName + ";" + "filename*=utf-8''''" + fileName);
     DgExcelUtil.getXlsx("导出sheet", exportClass, titleList, exportList).write(out);
} catch (Exception e) {
     LOGGER.error("导出报错:", e);
     throw new SmkException(ErrorCode.FAIL, "导出报错");
}
return new MessageResp<>();

报错日志

org.springframework.http.converter.HttpMessageNotWritableException: No converter for [class com.sk.financial.dg.supervision.response.MessageResp] with preset Content-Type ''application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8''
	at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:312)
	at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.handleReturnValue(RequestResponseBodyMethodProcessor.java:181)
	at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:78)
	at org.springframework.web.servlet.mvc.method.annotation.ServletinvocableHandlerMethod.invokeAndHandle(ServletinvocableHandlerMethod.java:124)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
	at org.springframework.web.servlet.dispatcherServlet.dodispatch(dispatcherServlet.java:1063)
	at org.springframework.web.servlet.dispatcherServlet.doService(dispatcherServlet.java:963)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:681)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:228)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:163)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:190)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:163)
	at com.sk.financial.dg.supervision.config.filter.SimpleCORSFilter.doFilter(SimpleCORSFilter.java:24)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:190)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:163)
	at com.sk.financial.dg.supervision.config.filter.LogbackFilter.doFilter(LogbackFilter.java:43)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:190)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:163)
	at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:124)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:190)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:163)
	at com.sk.financial.dg.supervision.config.filter.ReplaceStreamFilter.doFilter(ReplaceStreamFilter.java:36)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:190)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:163)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:190)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:163)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1723)
	at org.apache.tomcat.util.net.socketProcessorBase.run(SocketProcessorBase.java:49)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:748)

原因排查

点进报错日志的第一个文件AbstractMessageConverterMethodProcesso的writeWithMessageConverters方法,可以看到这样一段代码,它检测返回值中是否设置了contentType,有则把它赋给selectedMediaType,没有就从所有MediaType里自动选择匹配到的MediaType,赋给selectedMediaType。

MediaType selectedMediaType = null;
MediaType contentType = outputMessage.getHeaders().getContentType();
boolean isContentTypePreset = contentType != null && contentType.isConcrete();
if (isContentTypePreset) {
    if (logger.isDebugEnabled()) {
        logger.debug("Found ''Content-Type:" + contentType + "'' in response");
    }
    selectedMediaType = contentType;
}
else {
    HttpServletRequest request = inputMessage.getServletRequest();
    List<MediaType> acceptableTypes;
    try {
        acceptableTypes = getAcceptableMediaTypes(request);
    }
    catch (HttpMediaTypeNotAcceptableException ex) {
        int series = outputMessage.getServletResponse().getStatus() / 100;
        if (body == null || series == 4 || series == 5) {
            if (logger.isDebugEnabled()) {
                logger.debug("Ignoring error response content (if any). " + ex);
            }
            return;
        }
        throw ex;
    }
    List<MediaType> producibleTypes = getProducibleMediaTypes(request, valueType, targettype);

    if (body != null && producibleTypes.isEmpty()) {
        throw new HttpMessageNotWritableException(
                "No converter found for return value of type: " + valueType);
    }
    List<MediaType> mediaTypestoUse = new ArrayList<>();
    for (MediaType requestedType : acceptableTypes) {
        for (MediaType producibleType : producibleTypes) {
            if (requestedType.isCompatibleWith(producibleType)) {
                mediaTypestoUse.add(getMostSpecificmediaType(requestedType, producibleType));
            }
        }
    }
    if (mediaTypestoUse.isEmpty()) {
        if (body != null) {
            throw new HttpMediaTypeNotAcceptableException(producibleTypes);
        }
        if (logger.isDebugEnabled()) {
            logger.debug("No match for " + acceptableTypes + ", supported: " + producibleTypes);
        }
        return;
    }

    MediaType.sortBySpecificityAndQuality(mediaTypestoUse);

    for (MediaType mediaType : mediaTypestoUse) {
        if (mediaType.isConcrete()) {
            selectedMediaType = mediaType;
            break;
        }
        else if (mediaType.isPresentIn(ALL_APPLICATION_MEDIA_TYPES)) {
            selectedMediaType = MediaType.APPLICATION_OCTET_STREAM;
            break;
        }
    }

    if (logger.isDebugEnabled()) {
        logger.debug("Using ''" + selectedMediaType + "'', given " +
                acceptableTypes + " and supported " + producibleTypes);
    }
}

而在下一段代码中,selectedMediaType被用于转换返回值,报错是因为找到的selectedMediaType与返回值不匹配,没有通过((GenericHttpMessageConverter) converter).canWrite(targettype, valueType, selectedMediaType)判断,从而抛出异常。

if (selectedMediaType != null) {
    selectedMediaType = selectedMediaType.removeQualityValue();
    for (HttpMessageConverter<?> converter : this.messageConverters) {
        GenericHttpMessageConverter genericConverter = (converter instanceof GenericHttpMessageConverter ?
                (GenericHttpMessageConverter<?>) converter : null);
        if (genericConverter != null ?
                ((GenericHttpMessageConverter) converter).canWrite(targettype, valueType, selectedMediaType) :
                converter.canWrite(valueType, selectedMediaType)) {
            body = getAdvice().beforeBodyWrite(body, returnType, selectedMediaType,
                    (Class<? extends HttpMessageConverter<?>>) converter.getClass(),
                    inputMessage, outputMessage);
            if (body != null) {
                Object theBody = body;
                LogFormatUtils.traceDebug(logger, traceOn ->
                        "Writing [" + LogFormatUtils.formatValue(theBody, !traceOn) + "]");
                addContentdispositionHeader(inputMessage, outputMessage);
                if (genericConverter != null) {
                    genericConverter.write(body, targettype, selectedMediaType, outputMessage);
                }
                else {
                    ((HttpMessageConverter) converter).write(body, selectedMediaType, outputMessage);
                }
            }
            else {
                if (logger.isDebugEnabled()) {
					logger.debug("nothing to write: null body");
				}
			}
			return;
		}
	}
}

if (body != null) {
    Set<MediaType> producibleMediaTypes =
            (Set<MediaType>) inputMessage.getServletRequest()
                    .getAttribute(HandlerMapping.PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE);

    if (isContentTypePreset || !CollectionUtils.isEmpty(producibleMediaTypes)) {
        throw new HttpMessageNotWritableException(
                "No converter for [" + valueType + "] with preset Content-Type ''" + contentType + "''");
    }
    throw new HttpMediaTypeNotAcceptableException(getSupportedMediaTypes(body.getClass()));
}

因此可以通过置空返回值里的ContentType,来让处理器自行选择。

总结

以上是小编为你收集整理的导出excel报错:No converter for [class xxx] with preset Content-Type &#039;application/vnd.openxmlformats全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

原文地址:https://www.cnblogs.com/yiyuzi/p/16331319.html

(HttpMessageNotWritableException ) No converter found for return value of type xxxx

(HttpMessageNotWritableException ) No converter found for return value of type xxxx

最近在家没事儿,写写代码玩,用了 Maven 构建 SSM 项目,结果提示如下信息

org.springframework.http.converter.HttpMessageNotWritableException: No converter found for return value of type: class com.lcy.pojo.User
【原因】找不到返回值类型的转换器,找了好久发现controller返回的是json格式数据

【方案】在mavenpox.xml中只引入Json的依赖时,只引入了“jackson-core”;没有引入 “jackson-databind”,添加了依赖后问题解决了。
【提示】当controller标记@ResponseBody后,会用解析器去解析Controller的返回值,解析器会去寻找SpringMvc中注册的HttpMeesageConverter接口的实现类,结果因为没有添加对应的依赖,所以
就找不到Json类型的转换器了,添加依赖后就正常了。



【正确的依赖】
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
        <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.8</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.9.8</version>
        </dependency>

 






@JsonProperty无法用于Content-Type:application / x-www-form-urlencoded

@JsonProperty无法用于Content-Type:application / x-www-form-urlencoded

REST API映射到Java对象时,采用输入内容类型:application / x-www-form-urlencoded

 public class MyRequest {    @JsonProperty("my_name")    private String myName;    @JsonProperty("my_phone")    private String myPhone;    //Getters and Setters of myName and myPhone.    }

在表单输入请求中,我正在设置my_name和my_phone的值,但是MyRequest对象带有myName和myPhone作为空值。

我正在使用Jackson批注2.3 jar

有什么建议可能有什么问题吗?

答案1

小编典典

我最近在使用SpringMVC和Jackson时遇到了同样的问题!

在Spring中,当您将端点显式配置为仅使用application/x-www-form-urlencoded请求时,Spring可以序列化到POJO类中,但是它不使用Jackson,因为它不是JSON。

因此,为了使这些Jackson注释可以使用POJO进行工作,您必须:

以地图的形式获取数据
用Jackson的ObjectMapper解析数据映射
就我而言,使用Spring我可以使用以下代码解决此问题:

@RequestMapping(        value = "/rest/sth",        method = RequestMethod.POST)public ResponseEntity<String> create(@RequestBody MultiValueMap paramMap) { ... }

当您从@RequestMapping注释中删除“ consumes”属性时,您必须使用该属性,@RequestBody否则Spring将无法将您的地图识别为有效参数。

您可能会注意到的一件事是,MultiValueMap它不是常规地图。每个元素值都是一个LinkedList字母,因为http表单数据可以重复值,因此这些值将被添加到该链接列表中。

考虑到这一点,下面是一个简单的代码来获取第一个元素并创建另一个映射以转换为您的POJO:

    HashMap<String, Object> newMap = new HashMap<>();    Arrays.asList(new String[]{"my_name", "my_phone"})            .forEach( k -> newMap.put(k, ((List<?>) paramMap.get(k)).get(0)));    MyRequest myrequest = new ObjectMapper().convertValue(newMap, MyRequest.class);

application.properties提示Cannot resolve configuration property ''xxxx''

application.properties提示Cannot resolve configuration property ''xxxx''

1 问题描述

Spring Boot中的application.properties文件中,如果自定义属性会如下提示:

Cannot resolve configuration property ''xxxx''

在这里插入图片描述

2 解决方式一

这其实是一个警告,可以不用理会,正常运行,可以通过

@Value("${}")

正常获取到值,所以最暴力的方法就是关闭这个检查:

在这里插入图片描述

进入设置中的Editor-->Inspection-->Spring-->Spring Boot-->Spring Boot application properties,去掉右边勾选。

3 解决方式二(推荐)

在这里插入图片描述

这里提示Defind Configuration key a,然后按Alt+Shift+Enter后,就会创建一个addtional-spring-configuration-metadata.json的文件:

在这里插入图片描述

这里name是指定属性名字,type是类型,可以加上defaultValue指定默认值:

在这里插入图片描述

这样就不会有警告了:

在这里插入图片描述

applicationContext-common.xml]; nested exception is java.lang.NoClassDefFoundError: org/w3c/dom/E...

applicationContext-common.xml]; nested exception is java.lang.NoClassDefFoundError: org/w3c/dom/E...

14:59:16,747 ERROR ContextLoader:350 - Context initialization failed
org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from file [D:\eclipse\workspace_web\.metadata\.plugins\org.eclipse.wst.server.core\tmp4\wtpwebapps\czyxyg_ws\WEB-INF\classes\applicationContext-common.xml]; nested exception is java.lang.NoClassDefFoundError: org/w3c/dom/ElementTraversal
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:414)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:336)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:304)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:181)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:217)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:188)
at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:125)
at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:94)
at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:129)
at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:614)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:515)
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:443)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:325)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4973)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5467)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NoClassDefFoundError: org/w3c/dom/ElementTraversal
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2944)
at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1208)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1688)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1569)
at org.apache.xerces.parsers.AbstractDOMParser.startDocument(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaValidator.startDocument(Unknown Source)
at org.apache.xerces.impl.dtd.XMLDTDValidator.startDocument(Unknown Source)
at org.apache.xerces.impl.XMLDocumentScannerImpl.startEntity(Unknown Source)
at org.apache.xerces.impl.XMLVersionDetector.startDocumentParsing(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
at org.springframework.beans.factory.xml.DefaultDocumentLoader.loadDocument(DefaultDocumentLoader.java:76)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadDocument(XmlBeanDefinitionReader.java:429)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:391)
... 22 more
Caused by: java.lang.ClassNotFoundException: org.w3c.dom.ElementTraversal
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1718)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1569)
... 42 more

 

 

pom文件引入:

  • <dependency>
    <groupId>xml-apis</groupId>
    <artifactId>xml-apis</artifactId>
    <version>1.4.01</version>
    </dependency>

今天关于导出excel报错:No converter for [class xxx] with preset Content-Type 'application/vnd.openxmlformats的讲解已经结束,谢谢您的阅读,如果想了解更多关于(HttpMessageNotWritableException ) No converter found for return value of type xxxx、@JsonProperty无法用于Content-Type:application / x-www-form-urlencoded、application.properties提示Cannot resolve configuration property ''xxxx''、applicationContext-common.xml]; nested exception is java.lang.NoClassDefFoundError: org/w3c/dom/E...的相关知识,请在本站搜索。

本文标签: