SpringMVC中“未找到类型为java.lang.Integer的返回值的转换器”

SpringMVC中“未找到类型为java.lang.Integer的返回值的转换器”,java,spring,spring-mvc,Java,Spring,Spring Mvc,我的SpringMVC不能将整数或对象返回到页面,只有字符串可以返回到页面,我可以使用PrinterWriter将整数打印到页面,但不能返回整数 代码: 错误: No converter found for return value of type: class java.lang.Integer org.springframework.http.converter.HttpMessageNotWritableException: No converter found for return va

我的SpringMVC不能将整数或对象返回到页面,只有字符串可以返回到页面,我可以使用PrinterWriter将整数打印到页面,但不能返回整数 代码:

错误:

No converter found for return value of type: class java.lang.Integer
org.springframework.http.converter.HttpMessageNotWritableException: No converter found for return value of type: class java.lang.Integer
    org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:233)
    org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.handleReturnValue(RequestResponseBodyMethodProcessor.java:180)
    org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:82)
    org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:122)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:892)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797)
    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1039)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:897)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)
    org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)
    org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)
    org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
    org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)
    org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449)
    org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365)
    org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)
    org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)
    org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)
    org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362)
    org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
    org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:357)
    org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:270)
    org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
shiro没有问题,我在使用shiro之前就有这个问题

HelloWeb-servlet.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd                 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <!-- freemarker config -->
    <bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
        <property name="templateLoaderPath" value="/WEB-INF/templates/"/>
    </bean>
    <bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
        <property name="cache" value="true"/>
        <property name="prefix" value=""/>
        <property name="suffix" value=".ftl"/>
    </bean>

    <context:component-scan base-package="com.rtx" />

</beans>
Web.xml:

<servlet>
        <servlet-name>HelloWeb</servlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>HelloWeb</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
spring-web-shiro.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
       default-lazy-init="true">

    <description>Shiro Configuration</description>

    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <property name="realm" ref="myShiroRealm" />
        <property name="cacheManager" ref="cacheManager" />
    </bean>

    <bean id="myShiroRealm" class="com.rtx.shiro.LoginRealm">
        <property name="cacheManager" ref="cacheManager" />
    </bean>

    <!-- Shiro Filter -->
    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <property name="securityManager" ref="securityManager" />
        <property name="loginUrl" value="/index.jsp" />
        <property name="successUrl" value="/user_page.php" />
        <property name="unauthorizedUrl" value="/404.php" />
        <property name="filterChainDefinitions">
            <value>
                /login.php =anon
                /doLogin.action = anon
                /** = authc
            </value>
        </property>
    </bean>

    <bean id="cacheManager" class="org.apache.shiro.cache.MemoryConstrainedCacheManager" />

    <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />

    <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
          depends-on="lifecycleBeanPostProcessor">
        <property name="proxyTargetClass" value="true" />
    </bean>

    <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
        <property name="securityManager" ref="securityManager" />
    </bean>

</beans>
我的springMvc只能将字符串返回到页面,不能返回对象或整数,如何修复它?

您可以返回ResponseEntity并将数据包装到其中,而不是返回整数

像这样的

@RequestMapping(value = "/Integer.action", method = {RequestMethod.GET,RequestMethod.POST})
public ResponseEntity<?> testInteger(){
    return ResponseEntity.ok(5);
    // return new ResponseEntity<Integer>(5, HttpStatus.OK);
}
如文档所述,当您使用@ResponseBody进行注释时,Spring将使用HttpMessageConverter

有关内置转换器的列表,请参阅。已启用转换器的默认列表包括:

ByteArrayHttpMessageConverter,将字节[]转换为应用程序/八位字节流

StringHttpMessageConverter,将字符串转换为文本/纯文本

ResourceHttpMessageConverter,将资源转换为动态媒体类型

ResourceRegionHttpMessageConverter,将ResourceRegion转换为动态媒体类型

SourceHttpMessageConverter,将源代码转换为application/xml、text/xml或application/*+xml

AllEncompassingFormHttpMessageConverter,将各种类型转换为application/x-www-form-urlencoded

Jaxb2RootElementHttpMessageConverter,将@XmlRootElement注释对象转换为application/xml、text/xml或application/*+xml

更多1

如您所见,它们都不支持整数对象的转换

解决此问题的最简单方法是将返回类型更改为String,并在Integer对象上调用toString

或者,如文档所示,添加自定义消息转换器

1可能会有更多启用的转换器,具体取决于安装了哪些Spring模块,例如,如果Jackson在场,您将获得JSON支持:

MappingJackson2HttpMessageConverter,将ObjectMapper支持的对象转换为application/json

AtomFeedHttpMessageConverter,将提要转换为应用程序/atom+xml

RssChannelHttpMessageConverter,将频道转换为应用程序/rss+xml

MappingJackson2SmileHttpMessageConverter,将ObjectMapper支持的对象转换为应用程序/x-jackson-smile

MappingJackson2CborHttpMessageConverter,将ObjectMapper支持的对象转换为应用程序/cbor

ResponseEntity仅支持与@ResponseBody注释方法的返回类型相同的对象类型,因为这两种方法都使用相同的HttpMessageConverter实现列表来进行到HTTP响应正文的转换。-此外,ResponseEntity是@ResponseBody的替代方案,所以不要两者都用。-正如上面所说:ResponseEntity类似于@ResponseBody,但有状态和标题。
@RequestMapping(value = "/Integer.action", method = {RequestMethod.GET,RequestMethod.POST})
public ResponseEntity<?> testInteger(){
    return ResponseEntity.ok(5);
    // return new ResponseEntity<Integer>(5, HttpStatus.OK);
}
 @ResponseBody
@RequestMapping(value = "/Integer.action", method = {RequestMethod.GET,RequestMethod.POST})
public String testInteger(){
    Integer a = 1;
    return a.toString();
}