2015-03-12 7 views
1

Я строю службу REST на Java, используя MongoDB (mongodb-java-driver), Джерси и Джексон. Пример классов я использую заключается в следующем: РаботникуJava, MongoDB - Встроенный документ с REST

public class Employee extends BasicDBObject { 
    public Employee() {} 
    public Employee(String name, Company company) { 
     put("name", name); 
     put("company", company); 
    } 
    public String getName() { 
     return get("name").toString(); 
    } 
    public Company getCompany() { 
     return (Company) get("company"); 
    } 
    public void setCompany(Company company) { 
     put("company", company); 
    } 
} 

Компания

public class Company extends BasicDBObject { 
    public Company() {} 
    public Company(String name, String city) { 
     put("name", name); 
     put("city", city); 
    } 
    public String getName() { 
     return get("name").toString(); 
    } 
    public String getCity() { 
     return get("city").toString(); 
    } 
} 

и сервис REST

public class EmployeeRestSrv { 
    @POST 
    @Consumes(MediaType.APPLICATION_JSON) 
    public Response createEmployee(Employee employee) { 
     DBCollection employeesCollection = DataSource.getDbCollection("employees"); 
     employeesCollection.setObjectClass(Employee.class); 
     // employee.company.name ? 
     employeesCollection.insert(employee); 
     return Response.ok().build(); 
    } 
} 

DataSource класс, который на самом деле создает соединение с MongoDB.

Если я посылаю этот объект JSON с POST

{ 
    "employee" : "foo", 
    "company" : { 
     "name" : "foocompany", 
     "city" : "san francisco" 
    } 
} 

я правильно получить документ в employeesCollection.

Мой вопрос: когда в createEmployee в прокомментированной строке, как я могу получить доступ к полям внедренного объекта (Company)? Я также пробовал employee.get("company").get("name") без эффекта.

Конечной целью является «принудительное» отношение «один ко многим», и я хотел бы иметь возможность хранить в документе компании также список сотрудников.

ответ

0

Поскольку BasicDBObject в основном карта, я осуществил это ходить вокруг в классе Employee, чтобы получить структуру компании:

... 
public Company getCompany() { 
    try { 
     return new Company((Map) get("company")); 
    } catch(NullPointerException e) { 
     return null; 
    } 
} 

public void setCompany(Company c) { 
    put("company", c); 
} 
... 

Конечно Я также создал новый конструктор в Компании, чтобы принять карту:

public Company(Map m) { 
    super(m); 
} 
0

Попробуйте employee.get("company.name")

Это должно также работать для обновления вложенных документов.

Что касается отношений, это будет работать, поскольку вы храните отношения «один ко многим» как вложенные объекты.

+0

Это дает мне «java.lang.NullPointerException». – Marco

0

employee.getCompany().getName(); Когда вы говорите, что ваш код «не имел никакого эффекта», что вы имеете в виду? (Кроме того, вы имели в виду createEmployee, а не createUser, верно?)

+0

Да, извините ... Отредактировано! «Без эффекта» Я имею в виду, что я не могу получить то, что я ищу; код 'employee.get (« company »). get (« name »)' на самом деле не работает, поскольку он говорит 'не может найти метод символов get (java.lang.String)' для 'java.lang.Object' class ... К сожалению, 'employee.getCompany(). GetName()' дает мне ту же ошибку; Спасибо, в любом случае! – Marco

Смежные вопросы