Can you just use the sample code you provide below, only create a subclass of Representation that takes your serializer as the argument, maybe along with the mime type? Something like:
public class MyVariableRepresentation extends Representation { Serializer serializer; public MyVariableRepresentation(MediaType type, Serializer variantSerializer) { super(type); this.serializer = variantSerializer; } //Then override write method or something to call your serializer to do the serializing. } So your sample code becomes: public class MyResource extends Resource { public Map<MediaType,Serializer> map; public Representation represent(Variant variant) throws ResourceException { Serializer serializer = map.get(variant.getMediaType()); if (serializer == null) throw new ResourceException(Status.CLIENT_ERROR_UNSUPPORTED_MEDIA_TYPE); return new MyVariableRepresentation(variant.getMediaType(), serializer.encode(data)); // ?? } } Does this work? On Jan 22, 2010, at 6:27 PM, Jean-Philippe Steinmetz wrote: > Sure. With our particular use case we specify a map of media types to data > serializers in spring as a hash map. We then inject this map into each > resource. When the map is set in the class we then add all the media types > specified as map keys as acceptable variants. When the represent() function > is called we use the provided media type to retrieve the associated > serializer, throwing an unsupported media type error if the variant has no > corresponding serializer. We then serialize our data and send it back to the > client. It's the sending it back to the client part is where I am stuck. As > there is no default Representation class that I can merely pass in any object > type to whether it be string, bye array, etc. > > Here is an example of the Resource class. > > public class MyResource extends Resource > { > public Map<MediaType,Serializer> map; > > public Representation represent(Variant variant) throws ResourceException > { > Serializer serializer = map.get(variant.getMediaType()); > if (serializer == null) > throw new > ResourceException(Status.CLIENT_ERROR_UNSUPPORTED_MEDIA_TYPE); > return new Representation(serializer.encode(data)); // ?? > } > } > > Here is an example of our spring applicationContext.xml. > > <beans> > ... > <util:map id="map" map-class="java.util.HashMap"> > <entry> > <key><util:constant > static-field="org.restlet.data.MediaType.APPLICATION_FLASH"/></key> > <ref local="amfSerializer"/> > </entry> > <entry> > <key><util:constant > static-field="org.restlet.data.MediaType.APPLICATION_JSON"/></key> > <ref local="jsonSerializer"/> > </entry> > <entry> > <key><util:constant > static-field="org.restlet.data.MediaType.APPLICATION_XML"/></key> > <ref local="xmlSerializer"/> > </entry> > </util:map> > > <bean name="/my/resource" id="myResource" autowire="byName" > scope="prototype" > class="com.restlets.MyResource"> > <property name="map" ref="map"/> > </bean> > ... > </beans> > > On Fri, Jan 22, 2010 at 3:07 PM, Matt Kennedy <stinkym...@gmail.com> wrote: > I'm not a Spring user, so maybe that's why it isn't clear to me what you're > asking. Can you try phrasing this question a different way? I think I know > the answer to your problem because I've always had to deal with multiple > media types for the same resource, but I'm not sure I understand the problem. > Can you walk through a use-case? > > > On Jan 22, 2010, at 6:00 PM, Jean-Philippe Steinmetz wrote: > >> Thank you for the quick reply. This certainly would resolve the issue but it >> doesn't really offer the kind of solution I was hoping for. With this >> solution i'd still have to do a mapping of media type to some representation >> which is what I am trying to avoid. The thought was that there is a >> Representation that just outputs the message body regardless of whatever >> media type variant is set for it. That way I don't have to make a mapping of >> media type to anything. >> >> On Fri, Jan 22, 2010 at 1:27 PM, Matt Kennedy <stinkym...@gmail.com> wrote: >> I can't remember what 1.1.6's API looks like, but I do something like this >> with the 2.0 API. Basically, in the Resource's constructor, I use someting >> like: >> >> getVariants().add(new MyXMLRepresentation(this)) >> getVariants().add(new MyJSONRepresentation(this)) >> >> >> Each of those My* classes are a subclass of Representation, and the write() >> method is overridden to produce the custom media type. I pass the Resource >> object to the custom representation so that I have access to the resource >> during the write method. Also important is that in the constructor, you >> call the super constructor with the MediaType and resource as arguments, ex: >> >> //Constructor >> public MyJSONRepresentation(Resource res) >> { >> super(MediaType.APPLICATION_JSON, res); >> } >> >> I know something like this can be done with the 1.1.6 API because I was >> using it before I ported to 2.0, but now I can't find the 1.1.6 code. It >> probably isn't too different. >> >> On Jan 22, 2010, at 3:50 PM, Jean-Philippe Steinmetz wrote: >> >> > Hello all, >> > >> > We're using restlet 1.1.6 and for all our resources we want to support a >> > dynamic set of media types. We do this in our Spring configuration by >> > setting up a list of acceptable media types. My question is if there is a >> > Representation class I can use that will essentially accept any type of >> > data I push into it? For instance we support HTML, XML, JSON and AMF3 >> > therefore most of the time it's a string based representation but in the >> > case of AMF3 it is binary (byte array). So far the only way I see it is to >> > make a switch statement in our resource class for each media type but this >> > pretty much defeats the purpose of specifying supported media types in the >> > application configuration. >> > >> > Jean-Philippe >> >> ------------------------------------------------------ >> http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447&dsMessageId=2441312 >> > > ------------------------------------------------------ http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447&dsMessageId=2441602