0

flexjson 라이브러리를 사용하려고합니다. 하지만 내 개체에서 사용해야합니다 : com.google.api.client.util.DateTime 매개 변수 생성자가없는. 난 항상 메시지와 함께 NoSuchMethodException를 얻을 : Flexjson will instantiate any protected, private, or public no-arg constructor. 나는 소스가 그와 함께 일을하려고 여기에 코드입니다 :flexjson을 사용하여 객체 직렬화

constructor = clazz.getDeclaredConstructor(); 
constructor.setAccessible(true); 
return constructor.newInstance(); 

예외 인해 부족 빈 생성자에 clazz.getDeclaredConstructor()에 던져되고있다. 생성자를 찾는 가장 좋은 방법은 다음과 같습니다.

DateTime(long timestamp)?

누구든지이 라이브러리에서 이러한 종류의 문제가 발생합니까? 어쩌면 다른 것을 사용하도록 제안 할 수 있습니다. Google Cloud Endpoints에 의해 생성 된 개체를 직렬화하는 데 사용하고 있습니다. 어쩌면 다른 접근 방식으로 할 수 있을까요?

+0

가장 좋은 방법은 빈 생성자를 가지고있다. 타임 스탬프는 json 객체에있는 경우 나중에 설정됩니다. 그것을 위해 DateTime을 확장하는 것을 고려할 수 있습니다. – njzk2

+0

njzk2,'DateTime'은 자동 생성 된 파일에 있고'app-engine' 백엔드의'java.util.Date' 객체에서 생성되기 때문에 확장 할 수 없습니다. – sennin

답변

1

이렇게하려면 Flexjson의 소스 코드를 변경할 필요가 없습니다. 이를 처리하는 방법은 ObjectFactory의 고유 한 구현을 작성하고 바인딩하려는 유형에 대해이를 등록하는 것입니다. 거기에서 당신은 그러나 그것을 인스턴스화 할 수 있습니다. BeanObjectFactory를 서브 클래스 화하고 instantiate() 메소드를 오버라이드하는 것이 가장 쉽다. 거기에서 원하는 객체의 인스턴스를 만들려는 모든 작업을 수행 할 수 있습니다. BeanObjectFactory를 하위 클래스 화하면 해당 객체의 setter/getter를 사용하여 JSON의 개별 속성을 객체에 바인딩 할 수 있습니다. 개체가 속성 메서드를 지원하지 않으면 ObjectFactory를 구현하고 JSON에서 해당 개체의 값을 수동으로 설정하는 것이 더 쉬울 수도 있습니다. ObjectFactories를 구현하는 것에 대한 Flexjson 웹 사이트의 많은 문서가 있습니다.

그럼 당신은 사용하여 해당 데이터 유형에 ObjectFactory를 등록 할 수 있습니다 :

new JSONDeserializer<SomeObject>() 
    .use(DateTime.class, new DateTimeObjectFactory()) 
    .deserialize(json);