2017-10-05 9 views
-1

다른 클래스의 다른 속성이 포함 된 클래스가 있고 json을 클래스로 변환하려고하면 오류가 표시됩니다. I 나타나는 오류 여기JSON을 클래스로 매핑하면 작동하지 않습니다.

public static JSONObject acceptBusinessTravel(JSONObject input) { 
    String btId = getStringField(input, "id"); 
    MongoCollection businessTravels = getBTCollection(); 

    // Here is the problem... 
    BusinessTravelDTO bt = businessTravels.findOne(new ObjectId(btId)).as(BusinessTravelDTO.class); 
    bt.setStatus(BusinessTravelStatus.Accepted); 

    businessTravels.save(bt); 

    return new JSONObject().put("message", "The business travel has been ACCEPTED by your manager. Check your email."); 
    } 

:

"error": "org.jongo.marshall.MarshallingException: Unable to unmarshall result to class path.data.BusinessTravelDTO from content { \"_id\" : { \"$oid\" : \"59d6905411d58632fd5bd8a5\"} , \"travelerId\" 

jongo에서

내 클래스 :

import org.jongo.marshall.jackson.oid.MongoObjectId; 
import org.json.JSONObject; 

import java.util.List; 

public class BusinessTravelDTO { 
    @MongoObjectId 
    private String id; 

    private String travelerId; 

    private BusinessTravelStatus status; 

    List<FlightDTO> flights; 

    List<HotelDTO> hotels; 

    List<CarDTO> cars; 

    public BusinessTravelDTO() { } 

    public BusinessTravelDTO(JSONObject data) { 
    this.travelerId = data.getString("travelerId"); 
    this.status = BusinessTravelStatus.valueOf(data.getString("status")); 
    this.flights = HandlerUtil.getInputFlights(data.getJSONArray("flights")); 
    this.hotels = HandlerUtil.getInputHotels(data.getJSONArray("hotels")); 
    this.cars = HandlerUtil.getInputCars(data.getJSONArray("cars")); 
    } 

    public JSONObject toJson() { 
    return new JSONObject() 
      .put("id", this.id) 
      .put("travelerId", this.travelerId) 
      .put("status", this.status) 
      .put("flights", this.flights) 
      .put("hotels", this.hotels) 
      .put("cars", this.cars); 
    } 

그리고 여기에 내가 클래스에 변환 할 곳이다 docs 클래스가 빈 생성자가 있어야 지정되어 있습니다 ... http://jongo.org/#mapping 나는 2 생성자가, 나는 또한 시도 @JsonCreator를 사용했지만 성공하지 못했습니다. ... (
변환되지 않는 이유가 있습니까? 예를 들어 List CarDTO와 같은 BusinesTravelDTO 내부의 필드와 관련된 것이 될 수 있습니까?

+0

JSON 텍스트에는 '$ oid' 필드가있는 개체 유형의'_id' 필드가있는 반면, 'BusinessTravelDTO'에는 'String'유형의 id 필드가 있습니다. 어떻게 그 일을 기대 했습니까? --- 저는 코드에서 어디에서 마샬링을하는지 볼 수 없기 때문에 조금 혼란 스럽습니다. 우리가'acceptBusinessTravel()'메소드를 보여 주었던 점은 무엇입니까? – Andreas

+0

http://idownvotedbecau.se/noexceptiondetails/ – Andreas

+0

@Andreas 어쩌면 당신은 @ MongoObjectId를 놓쳤을 것입니다,이 anotation은 클래스에서 mongo object id를 사용할 수있게하지만, 넣지 않으면 '_id'가 어쨌든 장면 ... : - | –

답변

0

나는 해결책을 발견했다;

가 다음과 같이 toJson 방법을 다시 작성해야하는 모든 클래스 FlightDTO, HotelDTO, CarDTO 플러스 I의 빈 생성자를 필요 :

public JSONObject toJson() { 
    JSONObject obj = new JSONObject().put("id", this.id).put("travelerId", this.travelerId).put("status", this.status); 

    if (flights != null) { 
     JSONArray flightArray = new JSONArray(); 
     for (int i = 0; i < flights.size(); ++i) { 
     flightArray.put(flights.get(i).toJson()); 
     } 
     obj.put("flights", flightArray); 
    } 

    if (hotels != null) { 
     JSONArray hotelArray = new JSONArray(); 
     for (int i = 0; i < hotels.size(); ++i) { 
     hotelArray.put(hotels.get(i).toJson()); 
     } 
     obj.put("hotels", hotelArray); 
    } 

    if (cars != null) { 
     JSONArray carArray = new JSONArray(); 
     for (int i = 0; i < cars.size(); ++i) { 
     carArray.put(cars.get(i).toJson()); 
     } 
     obj.put("cars", carArray); 
    } 
    return obj; 
    } 

을 그리고 이것은 FlightDTO입니다;

public class FlightDTO { 
    @MongoObjectId 
    private String id; 

    private String departure; 
    private String arrival; 
    private String airline; 
    private Double price; 

    public FlightDTO() { 
    } 

    public FlightDTO(JSONObject data) { 
    this.departure = data.getString("departure"); 
    this.arrival = data.getString("arrival"); 
    this.airline = data.getString("airline"); 
    this.price = data.getDouble("price"); 
    } 

    public JSONObject toJson() { 
    return new JSONObject() 
      .put("id", this.id) 
      .put("departure", this.departure) 
      .put("arrival", this.arrival) 
      .put("airline", this.airline) 
      .put("price", this.price); 
    } 
} 

이제 제대로 작동합니다. :)