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
google-we...@googlegroups.com.
To unsubscribe from this group, send email to
google-web-tool...@googlegroups.com.
For more options, visit this group at
http://groups.google.com/group/google-web-toolkit?hl=en.