0

I am trying to retrieve data from mongodb via spring framework. At first I made return type Map<String, Object>, but I decided to change to User value object.

Below is the class for User VO

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

    @Id
    @Field(value="id")
    private String id;

    @Field(value="name")
    private String name;

    @Field(value="password")
    private String password;

    @Field(value="professional")
    private String professional;

    @Field(value="email")
    private String email;

    @Field(value="gravatar")
    private String gravatar;

    @PersistenceConstructor
    public User(String id, String name, String password, String professional, String email, String gravatar) {
        super();
        this.id = id;
        this.name = name;
        this.password = password;
        this.professional = professional;
        this.email = email;
        this.gravatar = gravatar;
    }

    public String getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

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

    public String getProfessional() {
        return professional;
    }

    public void setProfessional(String professional) {
        this.professional = professional;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getGravatar() {
        return gravatar;
    }

    public void setGravatar(String gravatar) {
        this.gravatar = gravatar;
    }
};

and Here is @repository to retrieve data

@Repository
public class MongoMemberDao implements CommonDao<String, Map<String, Object>, Exception> {

    @Autowired
    MongoTemplate template;

    final String COLLECTION_NAME = "user";

    @SuppressWarnings("unchecked")
    @Override
    public Map<String, Object> read(String key) throws Exception {
        Query findQuery = new Query();
        findQuery.addCriteria(Criteria.where("id").is(key));
        return template.findOne(findQuery, Map.class, COLLECTION_NAME);
    }

    public User readByDocument(String id) throws Exception {
        Query findOneQuery = new Query();
        findOneQuery.addCriteria(Criteria.where("id").is(id));
        return template.findOne(findOneQuery, User.class, COLLECTION_NAME);
    }
};

read method returns fine, but readByDocument does not(returns null not User instance). I read official document. But I do not get any clue of it.

FYI, The parameter Query looks same for both. Query: { "id" : "system"}, Fields: null, Sort: null

  • I want to know why readByDocument returns null

Thanks.

---- Edit

Follow is my Database Config

@Configuration
public class MongoConfig extends AbstractMongoConfiguration {
    private final String MONGO_URL = "127.0.0.1";
    private final Integer MONGO_PORT = 27017;

    @Override
    protected String getDatabaseName() {
        return "tfarm";
    }

    @Override
//  @Bean
    public Mongo mongo() throws Exception {
        return new MongoClient(MONGO_URL, MONGO_PORT);
    }
}

And I added this to WebApplictaionInitializer implement.

Juneyoung Oh
  • 7,318
  • 16
  • 73
  • 121

1 Answers1

1

For current solution

I found follow on official site

  • A field annotated with @Id (org.springframework.data.annotation.Id) will be mapped to the _id field.
  • A field without an annotation but named id will be mapped to the _id field.
  • The default field name for identifiers is _id and can be customized via the @Field annotation.

So I changed my VO like...

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

    @Id
    private ObjectId _id;

    @Field(value="id")
    private String id;

    @Field(value="name")
    private String name;

    @Field(value="password")
    private String password;

    @Field(value="professional")
    private String professional;

    @Field(value="email")
    private String email;

    @Field(value="gravatar")
    private String gravatar;

    @PersistenceConstructor
    public User(String id, String name, String password, String professional, String email, String gravatar) {
        super();
        this.id = id;
        this.name = name;
        this.password = password;
        this.professional = professional;
        this.email = email;
        this.gravatar = gravatar;
    }

    public String getId() {
        return id;
    }

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

    public ObjectId get_id() {
        return _id;
    }

    public void set_id(ObjectId _id) {
        this._id = _id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

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

    public String getProfessional() {
        return professional;
    }

    public void setProfessional(String professional) {
        this.professional = professional;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getGravatar() {
        return gravatar;
    }

    public void setGravatar(String gravatar) {
        this.gravatar = gravatar;
    }
};

Added ObjectId. In alternative, just removing @Id annotation works fine too. However

@Id
@Field(value="id")
String id;

will not work. Thanks for help.

Juneyoung Oh
  • 7,318
  • 16
  • 73
  • 121