google app engine을 이용하여 간단한 어플을 만드는 중 입니다.
eclipse plug in 으로 AppEngine프로젝틀르 만들고
다음과 같이 JDO Entity 2개를 만들었습니다.
@Entity
public class CheckIn {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Key key;
private String placeId;
private String userEmail;
private Date checkinDate;
public Key getKey() {
return key;
}
public String getPlaceId() {
return placeId;
}
public void setPlaceId(String placeId) {
this.placeId = placeId;
}
public String getUserEmail() {
return userEmail;
}
public void setUserEmail(String userEmail) {
this.userEmail = userEmail;
}
public Date getCheckinDate() {
return checkinDate;
}
public void setCheckinDate(Date date) {
checkinDate = date;
}
}
@Entity
public class Pizza {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Key key;
private String placeId;
private String userEmail;
private Date checkinDate;
public Key getKey() {
return key;
}
public String getPlaceId() {
return placeId;
}
public void setPlaceId(String placeId) {
this.placeId = placeId;
}
public String getUserEmail() {
return userEmail;
}
public void setUserEmail(String userEmail) {
this.userEmail = userEmail;
}
public Date getCheckinDate() {
return checkinDate;
}
public void setCheckinDate(Date date) {
checkinDate = date;
}
}
class이름을 빼고는 완전히 같은 내용입니다.
위 JDO로 backend와 라이브러리를 자동생성하고 앱엔진에 deploy한 뒤 andorid application에서 다음 코드로 data를 입력합니다.
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new PizzaTask().execute();
new CheckInTask().execute();
}
private class CheckInTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
CheckIn checkin = new CheckIn();
checkin.setPlaceId("StoreNo1234");
Checkinendpoint.Builder builder = new Checkinendpoint.Builder(
AndroidHttp.newCompatibleTransport(), new JacksonFactory(),
null);
builder = CloudEndpointUtils.updateBuilder(builder);
Checkinendpoint endpoint = builder.build();
try {
endpoint.insertCheckIn(checkin).execute();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
private class PizzaTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
Pizza pizza = new Pizza();
pizza.setPlaceId("choco");
Pizzaendpoint.Builder builder = new Pizzaendpoint.Builder(
AndroidHttp.newCompatibleTransport(), new JacksonFactory(),
null);
builder = CloudEndpointUtils.updateBuilder(builder);
Pizzaendpoint endpoint = builder.build();
try {
endpoint.insertPizza(pizza).execute();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}}
두 AsyncTask역시 class이름을 빼고는 동일한 코드입니다.
그런데 app engine서버 화면에서 실행된결과 로그를 확인해 보면 InsertCheckIn은 잘 완료가 되어 Datastore Viewer에서 확인이 됩니다. 하지만 InsertPizza는 500에러가 발생합니다.
애러 로그입니다.
- 2013-11-06 20:22:48.799
/_ah/spi/com.example.gaetest.CheckInEndpoint.insertCheckIn 200 3211ms
0kb Google-HTTP-Java-Client/1.16.0-rc (gzip) module=default version=1
- 2013-11-06 20:22:40.426
/_ah/spi/com.example.gaetest.PizzaEndpoint.insertPizza 500 5851ms 0kb
Google-HTTP-Java-Client/1.16.0-rc (gzip) module=default version=1
com.google.api.server.spi.SystemService invokeServiceMethod: null
java.lang.NullPointerException at
org.datanucleus.api.jpa.JPAEntityManager.find(JPA
제 생각에는 앤진 프로젝트를 deploy 했을 때 GAE에서 관련테이블을 생성하지 못하고 있는 것 같습니다. 새로운 프로젝트를 몇번씩 만들어 시도하여도 위의 결과만 되풀이되고 있습니다.
왜 동일한 두 코드로 실행하였는데 결과가 다를까요.
Google App Engine 개발자분들의 조언을구합니다.