Guys, I want to display images in a grid component. Those images are from a database, and I use a componet
import java.awt.image.BufferedImage; import java.io.IOException; import java.io.OutputStream; import javax.imageio.ImageIO; import org.apache.tapestry5.ComponentResources; import org.apache.tapestry5.Link; import org.apache.tapestry5.MarkupWriter; import org.apache.tapestry5.StreamResponse; import org.apache.tapestry5.annotations.Parameter; import org.apache.tapestry5.ioc.annotations.Inject; import org.apache.tapestry5.services.Response; public class ImageBlock { @Parameter (required=true) private BufferedImage bufferedImage; @Inject private Response response; @Inject private ComponentResources componentResources; boolean beginRender(MarkupWriter writer) { Link link = componentResources.createEventLink("image"); writer.element("img", "src", link.toAbsoluteURI(), "width", bufferedImage.getWidth(), "height", bufferedImage.getHeight()); componentResources.renderInformalParameters(writer); writer.end(); return false; } void onImage() throws IOException { response.setDateHeader("Expires", 0); response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate"); response.setHeader("Cache-Control", "post-check=0, pre-check=0"); response.setHeader("Pragma", "no-cache"); OutputStream stream = response.getOutputStream("image/jpeg"); ImageIO.write(bufferedImage, "jpg", stream); stream.flush(); stream.close(); } } This works well when I simply use <t:ImageBlock bufferedImage="image"/> When I try to use this in a grid, like this, <t:grid source="photos" row="photo"> <p:imageCell> <t:ImageBlock bufferedImage="photo.getImage()"> </p:imageCell> </t:grid> I get errors. org.apache.tapestry5.internal.services.RenderQueueException Render queue error in BeginRender[Search:grid.rows]: Failure writing parameter 'row' of component Search:grid.rows: Failure writing parameter 'row' of component Search:grid: Could not find a coercion from type java.lang.String to type domain.Photo. Available coercions: Double --> Float, Float --> Double, Long --> Boolean, Long --> Byte, Long --> Double, Long --> Integer, Long --> Short, Number --> Long, Object --> Object[], Object --> String, Object --> java.util.List, Object[] --> java.util.List, String --> Boolean, String --> Double, String --> Long, String --> java.io.File, String --> java.math.BigDecimal, String --> java.math.BigInteger, String --> java.text.DateFormat, String --> java.util.regex.Pattern, String --> org.apache.tapestry5.Renderable, String --> org.apache.tapestry5.SelectModel, String --> org.apache.tapestry5.corelib.LoopFormState, String --> org.apache.tapestry5.corelib.data.BlankOption, String --> org.apache.tapestry5.corelib.data.GridPagerPosition, String --> org.apache.tapestry5.corelib.data.InsertPosition, String --> org.apache.tapestry5.ioc.Resource, String --> org.apache.tapestry5.ioc.util.TimeInterval, boolean[] --> java.util.List, byte[] --> java.util.List, char[] --> java.util.List, double[] --> java.util.List, float[] --> java.util.List, int[] --> java.util.List, java.math.BigDecimal --> Double, java.util.Collection --> Boolean, java.util.Collection --> Object[], java.util.Collection --> org.apache.tapestry5.grid.GridDataSource, java.util.List --> org.apache.tapestry5.SelectModel, java.util.Map --> org.apache.tapestry5.SelectModel, long[] --> java.util.List, null --> Boolean, null --> org.apache.tapestry5.grid.GridDataSource, org.apache.tapestry5.ComponentResources --> org.apache.tapestry5.PropertyOverrides, org.apache.tapestry5.PrimaryKeyEncoder --> org.apache.tapestry5.ValueEncoder, org.apache.tapestry5.Renderable --> org.apache.tapestry5.Block, org.apache.tapestry5.Renderable --> org.apache.tapestry5.runtime.RenderCommand, org.apache.tapestry5.ioc.util.TimeInterval --> Long, org.apache.tapestry5.runtime.ComponentResourcesAware --> org.apache.tapestry5.ComponentResources, short[] --> java.util.List. Any suggestions? Thanks very much!