2013-10-31 2 views
16

appengine 클라우드 엔드 포인트를 사용하고 있습니다. 이전에 이러한 엔드 포인트를 배치했지만 지금은이를 업데이트하고 있으며 Objectify와 함께 작동하지 않습니다. 나는 새로운 기계로 옮겨서 최신 appengine 1.8.6을 달리고있다. 클래스 패스에 objectify를 넣으려고 시도했지만 작동하지 않았습니다. 나는 이것이 작동 할 수 있다는 것을 알고있다. 나는 무엇을 놓치고 있는가? Cloud Endpoints를 목표로 함

endpoints.sh 실행 :

Error: Parameterized type 
    com.googlecode.objectify.Key<MyClass> not supported. 

UPDATE : 내가 다시 내 이전 컴퓨터에 가서 같은 엔드 포인트에 endpoints.sh를 실행하고 괜찮 았는데. 오래된 기계는 1.8.3을 가지고 있습니다. objectify 3.1을 사용하고 있습니다.

업데이트 2 : 내 이전 컴퓨터를 1.8.6으로 업데이트하여 다른 컴퓨터와 동일한 오류가 발생했습니다. 이 가능성 잎 : 1) 엔드 포인트는 더 이상 3.1 또는 2) 엔드 포인트는 1

대부분의 경우 최신 버전의 버그를 객관화 지원을 ... 나는 어쨌든 4.0로 업데이트 했었어. ..

답변

18

Objectify가 널리 사용됨에 따라보다 일반적인 솔루션을 사용할 수있을 때까지 Key 유형을 지원하는 해결 방법이 이전 릴리스에 추가되었습니다. 새로운 솔루션을 사용할 수 있으므로 해결 방법이 제거되었습니다. 속성으로 문제에 접근 할 수있는 두 가지 방법이 있습니다.

  1. @ApiResourceProperty 주석을 추가하면 직렬화 중에 개체에서 키가 누락됩니다. 간단한 솔루션을 원하고 고객의 키에 액세스 할 필요가없는 경우이 접근 방식을 사용하십시오.
  2. 필드를 serialize/deserialize하는 호환 메커니즘을 제공하는 @ApiTransformer 주석을 추가하십시오. 클라이언트의 키 (또는 표현)에 액세스해야하는 경우이 방법을 사용하십시오. 이것은 변압기 클래스를 작성해야하므로 첫 번째 옵션보다 많은 작업이 필요합니다.
+0

안녕하세요, Dan, 관련성이없는 Google Cloud Endpoints의 제한 사항에 대해이 질문을 발견했습니다. 아직 클라우드 컴퓨팅이 제대로 작동하고 있는지 궁금해합니다. 답변이 좋을 것 같습니다. http://stackoverflow.com/questions/19786339/google -cloud-endpoints-restrictions-any-proposed-solutions – ZiglioUK

+1

향후 Objectify 키가 엔드 포인트에서 지원 될 예정입니까? – Sti

+0

@Sti Objectify Keys의 명시 적 핸들러를 다시 추가한다는 의미입니까? 나는 그렇게 생각하지 않는다. 일반적인 해결책은 Objectify 사례와 다른 것들 모두를 해결합니다. –

6

내 프로젝트에 대한 다음과 같은 솔루션을 내놓았다 :

@Entity 
public class Car { 

    @Id Long id; 

    @ApiResourceProperty(ignored = AnnotationBoolean.TRUE) 
    Key<Driver> driver; 

    public Key<Driver> getDriver() { 
     return driver; 
    } 

    public void setDriver(Key<Driver> driver) { 
     this.driver = driver; 
    } 

    public Long getDriverId() { 
     return driver == null ? null : driver.getId(); 
    } 

    public void setDriverId(Long driverId) { 
     driver = Key.create(Driver.class, driverId); 
    } 
} 

@Entity 
public class Driver { 
    @Id Long id; 
} 

내가 아는 한, 그것은 약간의 상용구하지만 헤이 - 작동 및 몇 가지 편리한 바로 가기 방법을 추가합니다.

+1

@ApiResourceProperty를 필드로 이동하여 복잡한 것을 절약 할 수 있습니다. –

0

처음에는 Flori가 제공 한 답변을 이해하지 못했고 실제로 얼마나 유용한 지 알 수 없었습니다. 다른 사람들이 유익하기 때문에, 나는 짧은 설명을 할 것이다.

앞에서 설명한 것처럼 @ApiTransformer을 사용하여 클래스에 대한 변환기를 정의 할 수 있습니다. 이렇게하면 유형이 Key<myClass> 인 것과 같이 직렬화되지 않는 필드가 Long과 같은 다른 것으로 변환됩니다.

클래스가 GCE로 처리 될 때 get{fieldName}set{FieldName}이라는 메서드가 자동으로 필드 {fieldName}을 변환하는 데 사용된다는 것이 밝혀졌습니다. Google 문서에서 어디서나이를 찾을 수 없었습니다.여기

내가 내 Exercise 클래스의 Key{Machine} 속성을 사용하는 방법입니다 :

public class Exercise { 
    @ApiResourceProperty(ignored = AnnotationBoolean.TRUE) 
    public Key<Machine> machine; 
    // ... more properties 

    public Long getMachineId() { 
    return this.machine.getId(); 
    } 

    public void setMachineId(Long machineId) { 
    this.machine = new Key<Machine>(Machine.class, machineId); 
    } 

    // ... 
} 
0

다른 사람이 이미 @ApiResourceProperty@ApiTransformer으로이 접근하는 방법을 언급했다. 하지만 클라이언트 쪽에서 사용할 수있는 키가 필요합니다. 모든 개체를 변형 할 필요가 없습니다. Objective Key를 com.google.appengine.api.datastore.Key으로 바꾸려고 시도했는데 문제가 여기있는 이유는 주로 엔드 포인트가 매개 변수화 된 유형을 지원하지 않기 때문입니다.

관련 문제