Spring 4 Controller不将JSON转换为Java类

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring 4 Controller不将JSON转换为Java类相关的知识,希望对你有一定的参考价值。

我正在尝试使用Spring将JSON转换为java类。当我执行代码时,我收到400个错误请求。如果我用通用java Oject(@RequestBody final **User** user)替换User java对象(@RequestBody final **Object** user),我将json字符串作为参数。

这是我的代码。

使用javascript

register : function(usr,pwd) {
    var user = {username : usr, password: pwd}
    return $http({
        method: 'POST',
        url: '/SpringSecurityRememberMeAnnotationExample/newuser',
        contentType: "application/json",
        data:user
    });
    /*
    return $http.post('/SpringSecurityRememberMeAnnotationExample/newuser', user).then(function(response) {
        return response.data;
    });
    */
},

控制器:

@Controller
@Scope("request")
public class HomeController {

    @RequestMapping(value = "/newuser", method = RequestMethod.POST)
    @ResponseBody public User SaveUser(@RequestBody final User user){
        System.out.println("username: ");// + user.username);
        System.out.println("password: ");// + user.password);
        return null;
    }

弹簧mvc.xml

<mvc:annotation-driven/>
<mvc:default-servlet-handler/>

<!-- Login Interceptor -->
<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="com.websystique.springsecurity.interceptor.LoginInterceptor"/>
    </mvc:interceptor>
    <!-- workaround to fix IE8 problem -->
    <bean id="webContentInterceptor"
          class="org.springframework.web.servlet.mvc.WebContentInterceptor">
        <property name="cacheSeconds" value="0"/>
        <property name="useExpiresHeader" value="true"/>
        <property name="useCacheControlHeader" value="true"/>
        <property name="useCacheControlNoStore" value="true"/>
    </bean>
</mvc:interceptors>

<!-- i18n -->
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="useCodeAsDefaultMessage" value="true"/>
    <property name="basename" value="WEB-INF/i18n"/>
    <property name="defaultEncoding" value="UTF-8"/>
    <property name="fileEncodings" value="UTF-8" />
</bean>
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.FixedLocaleResolver">
    <property name="defaultLocale" value="it"/>
    <property name="useCodeAsDefaultMessage" value="true"/>
</bean>

<!-- Exception handler -->
<bean id="exceptionResolver"
      class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
  <property name="exceptionMappings">
    <props>
      <prop key="LoginRequiredException">          
        public/loginRequired
      </prop>
      <prop key="ResourceNotFoundException">          
        public/notFound
      </prop>
    </props>
  </property>
  <property name="defaultErrorView" value="rescues/general" />
</bean>

<!-- View Handler -->
<bean id="jspViewResolver"
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass"
        value="org.springframework.web.servlet.view.JstlView" />
    <property name="prefix" value="/WEB-INF/views/" />
    <property name="suffix" value=".jsp" />
    <property name="order" value="0" />
</bean>
<bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
        <list>
            <ref bean="jacksonMessageConverter"/>
        </list>
    </property>
</bean>

谢谢!

添加POM.XML配置,json部分

<!-- JSon -->
        <dependency>
            <groupId>com.fasterxml.jackson.jaxrs</groupId>
            <artifactId>jackson-jaxrs-json-provider</artifactId>
            <version>2.6.4</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.6.4</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.6.4</version>
        </dependency>
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.9.13</version>
        </dependency>
答案

重新检查字段的setter / getters并确保有一个无参构造函数。 (如果你没有构造函数,Java将生成一个默认的无参数,但如果你自己添加了一个带参数的构造函数,你必须注意实现一个无参数)。

另一答案

主要问题是嵌入在控制器代码上的User类。一旦我在自己的包上创建了User.java文件,一切顺利。

另一答案

我猜你正在传递格式错误的json对象。你应该传递用户json数据,如下所示。

var user = {"username" : "<username>", "password": "<password>"};

并确保User.java具有字段和默认构造函数的setter / getter。

另一答案

请确保您的申请中有两个罐子

杰克逊 - 核心 杰克逊 - 映射器

Spring使用这两个Java API进行XML / JSON处理。

另一答案

var user = {"username" : usr, "password": pwd};放在java脚本中,并确认你的User类是正确的具有正确的setter getter和正确访问你的调用类。

以上是关于Spring 4 Controller不将JSON转换为Java类的主要内容,如果未能解决你的问题,请参考以下文章

分享spring boot controller统一日志代码

Spring Boot Controller(篇二)

Spring Controller 接收前端JSON数据

Spring Controller 建议修剪 JSON 数据

为啥@WebMvcTest 不将 Controller-Advices 加载到 Application-Context 中?

jQuery ajax 传递JSON数组到Spring Controller