I am trying to use GAE Blobstore with GWT. I have changed the sample they have online:
http://code.google.com/appengine/docs/java/blobstore/overview.html I replaced the jsp page with a GWT page (below). I replaced the call to "<%= blobstoreService.createUploadUrl("/upload") %>" with a RPC call which is initiated by "controller.getUploadURL("/index"). However I am getting the following error: SEVERE: [1273002680440000] javax.servlet.ServletContext log: Exception while dispatching incoming RPC call com.google.gwt.user.server.rpc.UnexpectedException: Service method 'public abstract java.lang.String net.compuroad.cerrado.client.data.DataAccessService.getUploadURL(java.lang.String)' threw an unexpected exception: java.lang.NoClassDefFoundError: com/ google/appengine/api/blobstore/BlobstoreServiceFactory at com.google.gwt.user.server.rpc.RPC.encodeResponseForFailure(RPC.java: 360) at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java: 546) at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java: 166) I have installed GAE SDK 1.3.3.1. Any ideas will be appreciated. Thanks, Wilson //GWT page to upload the images: public class ImagePage2 extends Page { private String[] mediaList = {"Select media","picture","video"}; private FileUpload upload = null; private Controller controller = null; private static CerradoConstants constants = null; private final FormPanel form = new FormPanel(); private VerticalPanel panel = new VerticalPanel(); private FlexTable table = new FlexTable(); private Button btnAddImage = new Button("Add Image"); private Button btnUpload = new Button("Upload"); private TextBox txtPropertyID = new TextBox(); private TextBox txtPropertyName = new TextBox(); /** * Constructor */ public ImagePage2(final Controller controller, final CerradoConstants constants) { this.constants = constants; this.controller = controller; // Create a FormPanel and point it at a service. //form.setAction(GWT.getModuleBaseURL() +"Image"); // Because we're going to add a FileUpload widget, we'll need to set the // form to use the POST method, and multipart MIME encoding. form.setEncoding(FormPanel.ENCODING_MULTIPART); form.setMethod(FormPanel.METHOD_POST); form.setWidget(panel); btnAddImage.addClickHandler( new ClickHandler(){ @Override public void onClick(ClickEvent event) { upload = new FileUpload(); upload.setName("uploadForm"); upload.setSize("450px", "25px"); panel.add(upload); } }); btnUpload.addClickHandler( new ClickHandler(){ @Override public void onClick(ClickEvent event) { /****** This call initiates the RPC call and generates the error ******/ controller.getUploadURL("/index"); } }); //********The upload URL should come back from the RPC call controller.getUploadURL("/index") using this listener controller.getData().addPropertyChangeListener("uploadURL", new PropertyChangeListener(){ @Override public void propertyChange(PropertyChangeEvent event) { String path = null; if (event.getNewValue()!= null){ path = (String ) event.getNewValue(); Window.alert("Upload URL: "+path); form.setAction(path); form.submit(); } } }); panel.add(btnAddImage); panel.add(btnUpload); // Add an event handler to the form. form.addFormHandler(new FormHandler() { @Override public void onSubmit(FormSubmitEvent event) { } public void onSubmitComplete(SubmitCompleteEvent event) { Window.alert(event.getResults()); } @Override public void onSubmitComplete(FormSubmitCompleteEvent event) { // TODO Auto-generated method stub Window.alert(event.getResults()); } }); // Add a 'submit' button. panel.add(new Button( "Submit", new ClickListener() { public void onClick(Widget sender) { form.submit(); } })); }//end constructor @Override public void hide() { RootPanel.get("content").clear(); } @Override public void propertyChange(PropertyChangeEvent event) { // TODO Auto-generated method stub } @Override public void show() { // TODO Auto-generated method stub //String text = String title = null; HTML htmlTitle = new HTML(); if (controller.getData().getProperty() != null){ title = "<p class='accTitle'>Add Images to the Property</p>"; //set the value inside Name like "propertyID: 12345"; txtPropertyID.setName("propertyID"); txtPropertyName.setName("propertyName"); txtPropertyID.setText(controller.getData().getProperty().getId()+""); txtPropertyName.setText(controller.getData().getProperty().getName()); txtPropertyID.setVisible(false); txtPropertyName.setVisible(false); panel.add(txtPropertyID); panel.add(txtPropertyName); } htmlTitle.setHTML(title); RootPanel.get("content").clear(); RootPanel.get("content").add(htmlTitle); // RootPanel.get("content").add(description); RootPanel.get("content").add(form); Cerrado.getInstance().getTopLinks().show(); } private String getUploadURL(){ return null; } } //Client Controller: public class Controller { private CerradoData data = null; private DataAccessServiceAsync service = null; private String source = null; public Controller (CerradoData data){ this.data = data; this.service = GWT.create(DataAccessService.class); } //some omitted code ... public void getUploadURL(String path) { AsyncCallback<String> callback = new AsyncCallback<String>() { public void onFailure(Throwable caught) { data.setMessage(caught.getMessage()); // data.firePropertyChange(null); System.out.println(caught.getStackTrace()); } public void onSuccess(String result) { data.fireUploadURLChange(result); System.out.println("upload path: "+ result); } }; // Make the call to the service. service.getUploadURL(path, callback); }//end of getUploadURL //RPC Server class: public class DataAccessServiceImpl extends RemoteServiceServlet implements DataAccessService{ private PersistenceManager pm; private static DataAccessServiceImpl instance; public DataAccessServiceImpl(){ pm = PMF.get().getPersistenceManager(); instance = this; } public static DataAccessServiceImpl getInstance(){ if (instance == null){ instance = new DataAccessServiceImpl(); } return instance; } //some omitted code ... public String getUploadURL(String successPath){ BlobstoreService service = BlobstoreServiceFactory.getBlobstoreService(); return service.createUploadUrl(successPath); } -- You received this message because you are subscribed to the Google Groups "Google Web Toolkit" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/google-web-toolkit?hl=en.
