2009-06-12 16 views
6

मैं बस जीडब्ल्यूटी के साथ खेलना शुरू कर रहा हूं मुझे जीडब्ल्यूटी + जावा + जेडीओ + Google AppEngine डेटास्टोर के साथ काम करने में वास्तव में कठिन समय है। मैं विभिन्न ट्यूटोरियल का पालन करने की कोशिश कर रहा था लेकिन कोई भाग्य नहीं था। उदाहरण के लिए मैं इन ट्यूटोरियल में जाता हूं: TUT1TUT2जेडब्ल्यूओ समस्या के साथ जीडब्ल्यूटी

मैं यह समझने में सक्षम नहीं था कि यह काम करने के लिए मुझे और कैसे करना है। कृपया मेरे सरल कोड को देख कर मुझे क्या मैं ऐसा करने के लिए की जरूरत है बताओ मैं डेटासंग्रह करने के लिए इसे जारी रहती है सकते हैं:

1. ADDRESS ENTITY को

package com.example.rpccalls.client; 

import java.io.Serializable; 

import javax.jdo.annotations.IdGeneratorStrategy; 
import javax.jdo.annotations.Persistent; 
import javax.jdo.annotations.PrimaryKey; 

public class Address implements Serializable{ 

@PrimaryKey 
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
private int addressID; 
@Persistent private String address1; 
@Persistent private String address2; 
@Persistent private String city; 
@Persistent private String state; 
@Persistent private String zip; 

public Address(){} 

public Address(String a1, String a2, String city, String state, String zip){ 
    this.address1 = a1; 
    this.address2 = a2; 
    this.city = city; 
    this.state = state; 
    this.zip = zip; 
} 

/* Setters and Getters */ 
} 

2. व्यक्ति ENTITY को

package com.example.rpccalls.client; 

import java.io.Serializable; 
import java.util.ArrayList; 

import javax.jdo.annotations.IdGeneratorStrategy; 
import javax.jdo.annotations.PersistenceCapable; 
import javax.jdo.annotations.Persistent; 
import javax.jdo.annotations.PrimaryKey; 

import com.google.appengine.api.datastore.Key; 

@PersistenceCapable 
public class Person implements Serializable{ 

@PrimaryKey 
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
private Key key; 
@Persistent private String name; 
@Persistent private int age; 
@Persistent private char gender; 
@Persistent ArrayList<Address> addresses; 

public Person(){} 

public Person(String name, int age, char gender){ 
    this.name = name; 
    this.age = age; 
    this.gender = gender; 
} 

/* Getters and Setters */ 
} 

3. RPCCalls

package com.example.rpccalls.client; 

import java.util.ArrayList; 

import com.google.gwt.core.client.EntryPoint; 
import com.google.gwt.core.client.GWT; 
import com.google.gwt.event.dom.client.ClickEvent; 
import com.google.gwt.event.dom.client.ClickHandler; 
import com.google.gwt.user.client.Window; 
import com.google.gwt.user.client.rpc.AsyncCallback; 
import com.google.gwt.user.client.ui.Button; 
import com.google.gwt.user.client.ui.RootPanel; 
import com.google.gwt.user.client.ui.TextBox; 


public class RPCCalls implements EntryPoint { 

private static final String SERVER_ERROR = "An error occurred while attempting to contact the server. Please check your network connection and try again."; 

private final RPCCallsServiceAsync rpccallService = GWT.create(RPCCallsService.class); 

TextBox nameTxt = new TextBox(); 
Button btnSave = getBtnSave(); 

public void onModuleLoad() { 

    RootPanel.get("inputName").add(nameTxt); 
    RootPanel.get("btnSave").add(btnSave); 
} 



private Button getBtnSave(){ 

    Button btnSave = new Button("SAVE"); 

    btnSave.addClickHandler(
    new ClickHandler(){ 
    public void onClick(ClickEvent event){ 
     saveData2DB(nameTxt.getText()); 
    } 
    } 
); 
    return btnSave; 
} 

void saveData2DB(String name){ 
    AsyncCallback<String> callback = new AsyncCallback<String>() { 
    public void onFailure(Throwable caught) { 
      Window.alert("WOOOHOOO, ERROR: " + SERVER_ERROR); 
    // TODO: Do something with errors. 
     } 

     public void onSuccess(String result) { 
      Window.alert("Server is saying: ' " + result + "'"); 
     } 

    }; 

    ArrayList<Address> aa = new ArrayList<Address>(); 
    aa.add(new Address("123 sasdf","", "Some City", "AZ", "93923-2321")); 
    aa.add(new Address("23432 asdf", "Appt 34", "Another City", "AZ", "43434-4432")); 

    Person p = new Person(); 
    p.setName(name); 
    p.setAge(23); 
    p.setGender('m'); 
    p.setAddresses(aa); 

    // !!!!!!!!!!!!!!!!!! SERVER CALL !!!!!!!!!!!!!!!!!! 
    rpccallService.saveName(p, callback); 
    // !!!!!!!!!!!!!!!!!! SERVER CALL !!!!!!!!!!!!!!!!!! 

} 
} 

4. RPCCallsService

package com.example.rpccalls.client; 

import com.google.gwt.user.client.rpc.RemoteService; 
import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; 

@RemoteServiceRelativePath("calls") 
public interface RPCCallsService extends RemoteService { 

String saveName(Person p); 

} 

5. RPCCallsServiceAsync

package com.example.rpccalls.client; 

import com.google.gwt.user.client.rpc.AsyncCallback; 

public interface RPCCallsServiceAsync { 

void saveName(Person p, AsyncCallback<String> callback); 

} 

6. ** RPCCalls.gwt.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 1.6.4//EN" "http://google-web-toolkit.googlecode.com/svn/tags/1.6.4/distro-source/core/src/gwt-module.dtd"> 
<module rename-to='rpccalls'>   
    <inherits name='com.google.gwt.user.User'/> 
    <inherits name='com.google.gwt.user.theme.standard.Standard'/> 
    <entry-point class='com.example.rpccalls.client.RPCCalls'/> 
</module> 

मैंने उन ट्यूटोरियल्स में कुंजी वर्ग और बाकी सब कुछ जोड़ने की कोशिश की लेकिन ऐसा लगता है कि मुझे कुछ याद आ रहा है।

यहाँ मेरी त्रुटि है: alt text http://vasura.s3.amazonaws.com/Picture2.png

या उससे पहले मैं इस त्रुटि हो रही थी:

Key cannot be resolved to a type

इस काम के बनाने के लिए सबसे अच्छा समाधान क्या है?

उत्तर

8

Sriram Narayan स्ट्रिंग एन्कोड करने के लिए कहते हैं कुंजी यह GWT के RPC तंत्र के माध्यम से पारित करने के लिए प्राप्त करने के लिए:

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class SomeDomainClass implements Serializable {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
@Extension(vendorName = "datanucleus", key = "gae.encoded-pk", value = "true")
String id;

+0

यह बहुत बढ़िया है, बहुत धन्यवाद! – Jamie

1

एक और विकल्प एक डीटीओ (डेटा ट्रांसफर ऑब्जेक्ट) को लागू करना होगा जिसे आप सीधे ऑब्जेक्ट्स का उपयोग करने के बजाय क्लाइंट में उपयोग कर रहे हैं। या, आप जेडीओ के बजाय जेपीए जा सकते हैं। उदाहरण में एपेंगेन जेपीए डॉक्स में डेटा क्लास आईडी कुंजी उस कार्यान्वयन के बजाय एक लंबा है http://code.google.com/appengine/docs/java/datastore/usingjpa.html

+0

यही है ट्यूटोरियल मैं पालन करने के लिए (ऊपर TUT2 लिंक) करने की कोशिश की । पहले मेरी पोस्ट पढ़ने की कोशिश करें और फिर जवाब दें। धन्यवाद था। – Maksim

+0

मूल उत्तर के बारे में क्षमा करें, आप सही हैं कि यह सहायक नहीं था। मैंने सवाल पढ़ा, लेकिन लिंक का पालन नहीं किया। – digitaljoel

+0

हाँ, मैं काम करने के लिए जेपीए बनाने में सक्षम था लेकिन मैं वस्तुओं को जीडब्ल्यूटी से कैसे पास करूं? – Maksim

1

क्या यह हो सकता है कि आप RPCCallsService के लिए कार्यान्वयन को भूल गए? मैं इसे आपके पास मौजूद फाइलों की सूची से नहीं देख सकता हूं।

आपके पास RPCCallsServiceImpl.java नामक फ़ाइल होना चाहिए RPCCalls/src/com/example/rpccalls/server/में, यह इंटरफ़ेस RPCCallsService.java के लिए कार्यान्वयन फ़ाइल है।

वह कुछ इस तरह दिखेगा:

import javax.jdo.JDOHelper; 
import javax.jdo.PersistenceManager; 
import javax.jdo.PersistenceManagerFactory; 
import com.google.gwt.user.server.rpc.RemoteServiceServlet; 
import com.example.rpccalls.client.RPCCallsService; 

public class RPCCallsServiceImpl extends RemoteServiceServlet implements RPCCallsService { 

    // Factory to get persistence manager object later 
    private static final PersistenceManagerFactory PMF = JDOHelper.getPersistenceManagerFactory("transactional-optional"); 

    public String saveName(Person p) { 
    // Data Store need persistence manager object for writing to it 
    PersistenceManager pm = PMF.getPersistenceManager(); 

    // Recommended way to save an object to the data store 
    try { 
     pm.makePersistent(p); 
    } finally { 
     pm.close(); 
    } 

    // You want it to return string 
    return p.getName(); 
    } 

} 

उम्मीद है कि आप समस्या को हल करने के लिए इस मदद करते हैं।चीयर्स :)

3

दूसरा ट्यूटोरियल आप संदर्भित किया है com.google.appengine.api.datastore.Key वर्ग पीछा पर एक अनुभाग है, यह GWT के लिए उपलब्ध नहीं है, क्योंकि:

Since I'm not doing anything with the Key class on the client I'm going to stub it out. This actually requires a few steps and involves the super-src feature of GWT XML module files.

आप the GWT documentation पर एक नज़र है, जो यह बताता है लेने के लिए चाहते हो सकता है

The heart of GWT is a compiler that converts Java source into JavaScript

, इसलिए आपको क्लाइंट कोड में किसी दिए गए वर्ग का उपयोग करने के लिए स्रोत कोड उपलब्ध होना आवश्यक है।

+0

यह एक आम गलती है क्योंकि आप मूल रूप से java.lang और java.util कक्षाओं को क्लाइंट साइड पर ले सकते हैं आपके ऐप का इस तरह आप उदाहरण के लिए क्लाइंट पक्ष में कुंजी या उपयोगकर्ता ऑब्जेक्ट्स भेजने में सक्षम नहीं होंगे। – Otavio

+1

दूसरा ट्यूटोरियल एक डरावना हैक है। क्या कोई बेहतर तरीका है? – dfrankow

3

एक बार जब आप JDO से तंग आ चुके हो, objectify पर एक नज़र डालें। मैंने इसे काम करने के लिए बहुत अच्छा पाया है, और इसमें डीटीओ के बिना पूर्ण जीडब्ल्यूटी इंटरऑप है।

3

आप इन अतिरिक्त जार फ़ाइलों जोड़कर GWT कोड में कुंजी वर्ग का उपयोग कर सकते हैं:

http://www.resmarksystems.com/code/

  • appengine-utils-ग्राहक-1.0.jar
  • appengine-utils-server-1.0 .jar

यह मूल रूप से जीडब्ल्यूटी कंपाइलर को कुंजी और अन्य ऐपइंजिन कक्षाओं का एक जीडब्ल्यूटी-अनुकूल संस्करण देता है। (पाठ, ब्लॉब और उपयोगकर्ता .. की तरह)

का उपयोग करें:

  • अपने निर्माण पथ में appengine-utils-ग्राहक-1.0.jar जोड़ें।
  • अपने वेब-आईएनएफ/lib फ़ोल्डर में appengine-utils-server-1.0.jar डाल दें।
  • अपने GWT मॉड्यूल के लिए निम्न जोड़ें:
    • < inherits नाम = "com.resmarksystems.AppEngineDataTypes" />
+0

एफडब्ल्यूआईडब्ल्यू रेजमार्क समाधान ने मेरे लिए जीडब्ल्यूटी 2.1.0 // जीएई 1.3.8 पर बहुत अच्छा काम किया। –

संबंधित मुद्दे