PDA

View Full Version : [CLOSED] [GXT3 Beta2]: Solve Caused by: java.lang.NoClassDefFoundError: org/json/JSONObject



BayerBusiness
1 Feb 2012, 10:26 AM
Hi eveyone,

not an actual bug (I think), but something I had a major problems. If the following code was run in developer mode, clicking on the "Send" button produced a long error stack trace. Within the stack trace the following problem was described: Caused by: java.lang.NoClassDefFoundError: org/json/JSONObject.

Solution: Include gwt-servlet-deps.jar explicitely to the build path
(see http://stackoverflow.com/questions/6378908/gwt-autobeans-noclassdeffounderror-what-am-i-doing-wrong)

The file is located (for my installation) in:
%Program Files%\eclipse_3.7_SR1_indigo\eclipse\plugins\com.google.gwt.eclipse.sdkbundle_2.4.0.v201201120043-rel-r37\gwt-2.4.0

Used code:

/**
* Entry point classes define <code>onModuleLoad()</code>.
*/
public class LearningGXT3 implements EntryPoint {
public interface Role {
long getId();

void setId(long id);

String getName();

void setName(String name);
}

interface RoleProperties extends PropertyAccess<Role> {
@Path("id")
ModelKeyProvider<Role> key();

ValueProvider<Role, Long> id();

ValueProvider<Role, String> name();
}


public interface RoleAutoBeanFactory extends AutoBeanFactory {
AutoBean<RecordResult> items();
AutoBean<ListLoadConfig> loadConfig();
}

/**
* Defines the structure of the root JSON object being returned by the server.
* This class is needed as we cannot return a list of objects. Instead, we
* return a single object with a single property that contains the data
* records.
*/
public interface RecordResult {
List<Role> getRecords();
}

class DataRecordJsonReader extends JsonReader<ListLoadResult<Role>, RecordResult> {
public DataRecordJsonReader(AutoBeanFactory factory, Class<RecordResult> rootBeanType) {
super(factory, rootBeanType);
}

@Override
protected ListLoadResult<Role> createReturnData(Object loadConfig, RecordResult incomingData) {
return new ListLoadResultBean<Role>(incomingData.getRecords());
}
}

/**
* This is the entry point method.
*/
public void onModuleLoad() {
RoleAutoBeanFactory factory = GWT.create(RoleAutoBeanFactory.class);

DataRecordJsonReader reader = new DataRecordJsonReader(factory, RecordResult.class);

String path = "http://<server>/roles.asmx/getItemsGXT3";
RequestBuilder builder = new RequestBuilder(RequestBuilder.POST, path);
builder.setHeader("content-type", "application/json");

HttpProxy<ListLoadConfig> proxy = new HttpProxy<ListLoadConfig>(builder);
// Create JSON
proxy.setWriter(new JsonWriter<ListLoadConfig>(factory, ListLoadConfig.class));

final ListLoader<ListLoadConfig, ListLoadResult<Role>> loader =
new ListLoader<ListLoadConfig, ListLoadResult<Role>>(proxy, reader);

RoleProperties props = GWT.create(RoleProperties.class);

ListStore<Role> store = new ListStore<Role>(props.key());

ColumnConfig<Role, Long> cc1 = new ColumnConfig<Role, Long>(props.id(), 100, "ID");
ColumnConfig<Role, String> cc2 = new ColumnConfig<Role, String>(props.name(), 100, "Name");

List<ColumnConfig<Role, ?>> l = new ArrayList<ColumnConfig<Role, ?>>();
l.add(cc1);
l.add(cc2);
ColumnModel<Role> cm = new ColumnModel<Role>(l);

Grid<Role> view = new Grid<Role>(store, cm);
view.getView().setForceFit(true);
view.setLoader(loader);

Button sendButton = new Button("Send");
sendButton.addClickHandler(new ClickHandler() {

@Override
public void onClick(ClickEvent event) {
loader.load();
}
});

// We can add style names to widgets
sendButton.addStyleName("sendButton");

// Add the nameField and sendButton to the RootPanel
// Use RootPanel.get() to get the entire body element
RootPanel.get("sendButtonContainer").add(sendButton);
RootPanel.get().add(view);
}
}

If there is a better way to solve this issue: Any hints are appreciated.

Regards,
Björn

robferguson
1 Feb 2012, 2:21 PM
Hi,

I ran into the same issue. I then checked the WEB-INF/lib directory of the examples war (gxt-examples-3.0.0-beta1.war) and noticed the JSON jar (json-20090211.jar). So I updated my POM to include the gwt-servlet-deps dependency:



<dependency>
<groupId>com.google.gwt</groupId>
<artifactId>gwt-servlet-deps</artifactId> <!-- required for AutoBean support -->
<version>${gwt.version}</version>
<scope>runtime</scope>
</dependency>

Your approach is fine.

Cheers
Rob

http://code.google.com/p/gwt-cx/