In Restlet 2.3 (SE) I am trying to use media types to control versions. My current attempt involves registering new extensions in my inbound route:
@Override
public Restlet createInboundRoot() {
        ...
        getTunnelService().setExtensionsTunnel(true);
        getMetadataService().addExtension("vnd.myapp.v1", MediaType.valueOf("application/vnd.myapp.v1+json"));
        getMetadataService().addExtension("vnd.myapp.v2", MediaType.valueOf("application/vnd.myapp.v2+json"));
        ...
}
My resource interface is then setup as follows:
public interface UsersResource {
    @Options
    void getCorsSupport();
    @Get("vnd.myapp.v1")
    Collection<User> representV1() throws Exception;
    // Should be the default if */* is specified
    @Get("json | vnd.myapp.v2")
    Collection<User> representV2() throws Exception;
}
I then tried specifying the media types as follows:
http://localhost:8080/api/users?media=vnd.myapp.v1
The idea is that if somebody specifies the media type as vnd.myapp.v1 they get representV1() (JSON), if they specify the media type as vnd.myapp.v2 they get representV2() (JSON) and (optionally) if they ask for nothing specific they get representV2(). With the above setup no matter what is requested I always get back representV2(). 
                        
Here is what I had when testing:
Accept: application/vnd.myapp.v1+json->representV1is calledAccept: application/vnd.myapp.v2+json->representV2is calledAccept: application/application/json->representV1is calledAccept: */*->representV1is calledIt seems that the expression
json | vnd.myapp.v2doesn't work properly. The workaround is to split representV2 into two methods withjsonandvnd.myapp.v2.When no accept header is specified, it seems that Restlet calls the first method with annotation
Getit finds.Something that could help you is to enable traces to see the scores of the different methods:
You'll see traces like that:
Hope it helps you, Thierry