0
votes

I have a User bean with a property address. I have implemented custom converter for the User and the Address class and configured the same in spring XML. The converter for User is getting called every time I save User object. But, converter for Address is not getting called while saving the User and it throwing can't serialize class com.mkyong.model.Address.

Here is my class structure and Xml config:

User Class:

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 + "]";
    }

}

Address class :

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 + "]";
    }
}

spring configuration:

<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>

User Converter :

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;
    }

}

Address Converter :

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();
    }

}

I am very new to spring mongodb. Any help is greatly appreciated!

1

1 Answers

0
votes

Please annotate UserConverter with @Component so that your converter will be picked by Spring Container.