2015-06-08 61 views
1

在Restlet 2.3(SE)我试图使用媒体类型来控制版本。我当前的尝试包括在我的呼入路由注册新的扩展:Restlet使用自定义媒体类型

@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")); 

     ... 
} 

我的资源接口则设置如下:

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; 

} 

然后我试图指定如下的媒体类型:

http://localhost:8080/api/users?media=vnd.myapp.v1 

这个想法是,如果有人指定媒体类型为vnd.myapp.v1,他们得到representV1()(JSON),如果他们指定媒体类型为vnd.myapp.v2他们得到representV2()(JSON)和(可选),如果他们没有要求任何具体的东西representV2()。有了上述设置,无论要求什么,我总是会回到representV2()

回答

1

这里是我有什么,当测试:

  • Accept: application/vnd.myapp.v1+json - >representV1
  • Accept: application/vnd.myapp.v2+json - >representV2
  • Accept: application/application/json - >representV1
  • Accept: */* - >representV1是称为

看来,表达式json | vnd.myapp.v2无法正常工作。解决方法是将代表V2分成两个方法,分别为jsonvnd.myapp.v2

当没有指定accept头时,Restlet似乎会调用第一个方法,它找到了注释Get

的东西,可以帮助你,是让痕迹,看到的不同的方法得分:

public class RestletLauncher { 
    public static void main(String[] args) { 
     Engine.getInstance().setLogLevel(Level.FINEST); 
     launchApplication(); 
    } 
} 

你会看到痕迹这样的:

Score of annotation "MethodAnnotationInfo [javaMethod: public org.restlet.representation.Representation test.MyServerResource1.testGetVnd1(), javaClass: class test.MyServerResource1, restletMethod: GET, input: vnd.myapp.v1, value: vnd.myapp.v1, output: vnd.myapp.v1, query: null]"= 0.5 
Total score of variant "[application/vnd.myapp.v1+json]"= 0.04191667 
Score of annotation "MethodAnnotationInfo [javaMethod: public org.restlet.representation.Representation test.MyServerResource1.testGetJson(), javaClass: class test.MyServerResource1, restletMethod: GET, input: json, value: json, output: json, query: null]"= 0.5 
Total score of variant "[application/json]"= 0.04191667 
Score of annotation "MethodAnnotationInfo [javaMethod: public org.restlet.representation.Representation test.MyServerResource1.testGetVnd2(), javaClass: class test.MyServerResource1, restletMethod: GET, input: vnd.myapp.v2, value: vnd.myapp.v2, output: vnd.myapp.v2, query: null]"= 0.5 
Total score of variant "[application/vnd.myapp.v2+json]"= 0.04191667 

希望它可以帮助你, Thierry