【问题标题】:custom converter not called spring data mongodb [can't serialize class error]自定义转换器未调用 spring data mongodb [无法序列化类错误]
【发布时间】:2019-03-06 10:45:54
【问题描述】:

我有一个带有 address 属性的 User bean。我已经为 User 和 Address 类实现了自定义转换器,并在 spring XML 中配置了相同的转换器。每次我保存 User 对象时都会调用 User 的转换器。但是,地址转换器在保存用户时没有被调用,它抛出 can't serialize class com.mkyong.model.Address

这是我的类结构和 Xml 配置:

用户类别:

package com.mkyong.model;


import java.util.Map;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection = "person")
public class User {

    @Id
    private String id;

    String username;

    String password;

    Address address;

    Map data;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    public Map getData() {
        return data;
    }

    public void setData(Map data) {
        this.data = data;
    }

    public User(String username, String password) {
        super();
        this.username = username;
        this.password = password;
    }

    @Override
    public String toString() {
        return "User [id=" + id + ", username=" + username + ", password=" + password + "]";
    }

}

地址类:

package com.mkyong.model;

import java.io.Serializable;
import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection = "address")
public class Address implements Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = 2310280839505243479L;
    String city;
    String dist;
    String state;

    public Address(String city, String dist, String state) {
        super();
        this.city = city;
        this.dist = dist;
        this.state = state;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getDist() {
        return dist;
    }

    public void setDist(String dist) {
        this.dist = dist;
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    @Override
    public String toString() {
        return "Address [city=" + city + ", dist=" + dist + ", state=" +    state + "]";
    }
}

弹簧配置:

<mongo:mongo host="127.0.0.1" port="27017" />
    <mongo:db-factory dbname="springbootdb" />

    <mongo:mapping-converter id="mongoConverter">
        <mongo:custom-converters base-package="com.mkyong.model">
            <mongo:converter>
                <bean class="com.mkyong.converter.UserConverter" />
            </mongo:converter>
            <mongo:converter>
                <bean class="com.mkyong.converter.AddressConverter" />
            </mongo:converter>
        </mongo:custom-converters>
    </mongo:mapping-converter>

    <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
        <constructor-arg name="mongoConverter" ref="mongoConverter" />
        <constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
    </bean>

用户转换器:

package com.mkyong.converter;

import org.springframework.core.convert.converter.Converter;
import com.mkyong.model.User;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;

public class UserConverter implements Converter<User, DBObject> {

    @Override
    public DBObject convert(User user) {
        DBObject dbObject = new BasicDBObject();
        dbObject.put("_id", user.getId());
        dbObject.put("_address", user.getAddress());
        System.out.println("called !!!!!");
        return dbObject;
    }

}

地址转换器:

package com.mkyong.converter;

import org.springframework.core.convert.converter.Converter;
import com.mkyong.model.Address;
import com.mkyong.model.DecimalNumber;
import com.mkyong.model.User;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;

public class AddressConverter implements Converter<Address, String> {

    @Override
    public String convert(Address user) {
        System.out.println("Not called!!!");
        return user==null ? null : user.toString();
    }

}

我对spring mongodb很陌生。非常感谢任何帮助!

【问题讨论】:

    标签: java spring mongodb spring-data-mongodb converters


    【解决方案1】:

    请使用@Component 注释UserConverter,以便Spring Container 选择您的转换器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-21
      相关资源
      最近更新 更多