My domain/model/dto object starts as

  public class FacilityAdminDto {
      private Facility facility;
      private Set<Platform> platforms;

and then it has the usual getters and setters.

The jsp that's setting this has for the platforms part

  <table cellspacing="0" class="platformsAdd">
      <c:forEach var="platform" items="${actionBean.platforms}">
          <tr>
              <td>
                  ${platform.name}
              </td>

              <td>
                  <stripes:checkbox
                      name="facilityAdminDto.platforms"
                      value="${platform.id}"
                  />
              </td>
          </tr>
      </c:forEach>
  </table>

The action bean has a getter for platforms; it's getting them from a database.  
When I view the source html the platform name and id are correct.

The platform id is of type com.google.appengine.api.datastore.Key so I have 
registered a TypeConverter and Formatter for it; its relevant code is

public class KeyConverterFormatter implements TypeConverter<Key>, 
Formatter<Key> {
    private final transient Logger log = LoggerFactory.getLogger(getClass());

    @Override
    public Key convert(final String input, final Class<? extends Key> 
targetType,
            final Collection<ValidationError> errors) {
        this.log.debug("input: {}", input);

        return (KeyFactory.stringToKey(input));
    }

    @Override
    public String format(final Key key) {
        this.log.debug("key: {}", key);

        return (KeyFactory.keyToString(key));
    }

KeyFactory is a google gizmo to fiddle with Keys.

My problem is that when Stripes is calling the FacilityAdminDto's setPlatforms, 
the Platform object it has created has its name set to the stringified id 
that's in the jsp, the value= part of the checkbox.  As far as I can tell it's 
because it's calling a Platform constructor that takes a string arg (it has 
several constructors)

    public Platform(final String _name) {
        this(_name, 0);

        this.log.debug("creating with name: {}", _name);
    }

    public Platform(final String _name, final int _ordinal) {
        this.name = _name;
        this.ordinal = Short.valueOf((short) _ordinal);
    }

In my logs I can see the debug log statement; I never call that constructor.  
In my logs the toString for FacilityAdminDto also shows that the Platform Set 
has Platforms with their names set to the id string that was in the jsp.

If I comment out that constructor (and fix my test code to use the one that 
specifies an ordinal), then it still tries to call it but gets an exception

[rusty-sandbox/4.338085272165943020].<stdout>: 2009-11-29 03:44:35.940 UTC,  
WARN: [Runtime Network Thread] net.sourceforge.stripes.util.Log.warn.94: Looks 
like type converter null threw an exception.
java.lang.NoSuchMethodException: 
com.objecteffects.waitlist.db.domain.Platform.<init>(java.lang.String)
        at 
com.google.appengine.runtime.Request.process-d0a9e5719e29d625(Request.java) 
[na:na]
        at java.lang.Class.getConstructor0(Unknown Source) [na:1.6.0_13]
        at java.lang.Class.getConstructor(Class.java:189) [na:1.6.0_13]
        at 
net.sourceforge.stripes.controller.DefaultActionBeanPropertyBinder.convert(DefaultActionBeanPropertyBinder.java:795)
 [stripes-1.5.2.jar:na]
        at 
net.sourceforge.stripes.controller.DefaultActionBeanPropertyBinder.bind(DefaultActionBeanPropertyBinder.java:182)
 [stripes-1.5.2.jar:na]
        at 
net.sourceforge.stripes.controller.DispatcherHelper$3.intercept(DispatcherHelper.java:218)
 [stripes-1.5.2.jar:na]
        at 
net.sourceforge.stripes.controller.ExecutionContext.proceed(ExecutionContext.java:158)
 [stripes-1.5.2.jar:na]
        at 
net.sourceforge.stripes.controller.BeforeAfterMethodInterceptor.intercept(BeforeAfterMethodInterceptor.java:113)
 [stripes-1.5.2.jar:na]
        at 
net.sourceforge.stripes.controller.ExecutionContext.proceed(ExecutionContext.java:155)
 [stripes-1.5.2.jar:na]
        at 
net.sourceforge.stripes.controller.ExecutionContext.wrap(ExecutionContext.java:74)
 [stripes-1.5.2.jar:na]
        at 
net.sourceforge.stripes.controller.DispatcherHelper.doBindingAndValidation(DispatcherHelper.java:214)
 [stripes-1.5.2.jar:na]
        at 
net.sourceforge.stripes.controller.DispatcherServlet.doBindingAndValidation(DispatcherServlet.java:254)
 [stripes-1.5.2.jar:na]
        at 
net.sourceforge.stripes.controller.DispatcherServlet.service(DispatcherServlet.java:148)
 [stripes-1.5.2.jar:na]
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:806) [na:na]
        at 
org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487) [na:na]
        at 
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1093)
 [na:na]
        at 
net.sourceforge.stripes.controller.StripesFilter.doFilter(StripesFilter.java:247)
 [stripes-1.5.2.jar:na]
        at 
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
 [na:na]
        at 
com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:35)
 [na:na]
        at 
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
 [na:na]
        at 
com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
 [appengine-api.jar:na]
        at 
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
 [na:na]
        at 
org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360) [na:na]
        at 
org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
[na:na]
        at 
org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181) [na:na]
        at 
org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712) [na:na]
        at 
org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405) [na:na]
        at 
com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:238)
 [na:na]
        at 
org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139) [na:na]
        at org.mortbay.jetty.Server.handle(Server.java:313) [na:na]
        at 
org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:506) [na:na]
        at 
org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:830)
 [na:na]
        at 
com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:76)
 [na:na]
        at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:381) 
[na:na]
        at 
com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:139)
 [na:na]
        at 
com.google.apphosting.runtime.JavaRuntime.handleRequest(JavaRuntime.java:239) 
[na:na]
        at 
com.google.apphosting.base.RuntimePb$EvaluationRuntime$6.handleBlockingRequest(RuntimePb.java:5135)
 [na:na]
        at 
com.google.apphosting.base.RuntimePb$EvaluationRuntime$6.handleBlockingRequest(RuntimePb.java:5133)
 [na:na]
        at 
com.google.net.rpc.impl.BlockingApplicationHandler.handleRequest(BlockingApplicationHandler.java:24)
 [na:na]
        at 
com.google.net.rpc.impl.RpcUtil.runRpcInApplication(RpcUtil.java:363) [na:na]
        at com.google.net.rpc.impl.Server$2.run(Server.java:814) [na:na]
        at 
com.google.tracing.LocalTraceSpanRunnable.run(LocalTraceSpanRunnable.java:56) 
[na:na]
        at 
com.google.tracing.LocalTraceSpanBuilder.internalContinueSpan(LocalTraceSpanBuilder.java:516)
 [na:na]
        at com.google.net.rpc.impl.Server.startRpc(Server.java:769) [na:na]
        at com.google.net.rpc.impl.Server.processRequest(Server.java:351) 
[na:na]
        at 
com.google.net.rpc.impl.ServerConnection.messageReceived(ServerConnection.java:437)
 [na:na]
        at 
com.google.net.rpc.impl.RpcConnection.parseMessages(RpcConnection.java:319) 
[na:na]
        at 
com.google.net.rpc.impl.RpcConnection.dataReceived(RpcConnection.java:290) 
[na:na]
        at com.google.net.async.Connection.handleReadEvent(Connection.java:436) 
[na:na]
        at 
com.google.net.async.EventDispatcher.processNetworkEvents(EventDispatcher.java:762)
 [na:na]
        at 
com.google.net.async.EventDispatcher.internalLoop(EventDispatcher.java:207) 
[na:na]
        at com.google.net.async.EventDispatcher.loop(EventDispatcher.java:101) 
[na:na]
        at 
com.google.net.rpc.RpcService.runUntilServerShutdown(RpcService.java:251) 
[na:na]
        at 
com.google.apphosting.runtime.JavaRuntime$RpcRunnable.run(JavaRuntime.java:396) 
[na:na]
        at java.lang.Thread.run(Unknown Source) [na:1.6.0_13]

I'm lost and confused.


------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
_______________________________________________
Stripes-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/stripes-users

Reply via email to