2014-02-27 66 views
0

我發現很難將確切的問題轉化爲單詞,所以我只舉一個例子。使用JAX-RS(澤西島)獲取其名稱的枚舉值

我有一個REST服務,它允許查看所有可用的枚舉,方法是爲每個枚舉創建一個鏈接。這工作正常。

但現在我需要找到一種方式來顯示具體的枚舉值在JSON中,當提供的鏈接之一被點擊。

EnumResource.class:

@Path("/enums") 
public class EnumsResource 
{ 

    public EnumsResource() 
    { 

    } 

    @SuppressWarnings("rawtypes") 
    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    public Response enums(@Context 
      UriInfo info){ 

     List<Class> resourceClasses = getAllResourceClasses(); 
     List<Link> enumLinks = new ArrayList<Link>(); 
     String contextPath = Link.getFullyQualifiedContextPath(info); 

     for (Class clazz : resourceClasses) 
     { 
      for (Field field : clazz.getDeclaredFields()) 
      { 
       if (field.getAnnotation(Enumerated.class) != null) 
       { 
        Link link = new Link(contextPath+"/enums/", field.getName()); 
        enumLinks.add(link); 
       } 
      } 

     } 


     RestResponseMetadata metadata = new RestResponseMetadata(200, 200000); 
     RestResponse response = new RestResponse(metadata, enumLinks); 
     return Response.ok().entity(response).build(); 

    } 


    @SuppressWarnings("rawtypes") 
    @GET 
    @Path("/{enum}") 
    @Produces(MediaType.APPLICATION_JSON) 
    public Response enums(@PathParam("enum") String enumName){ 

    ???? 

    } 


    @SuppressWarnings("rawtypes") 
    private List<Class> getAllResourceClasses() 
    { 
     List<Class> classes = new ArrayList<Class>(); 
     for (ResourcePath path : ResourcePathProvider.getInstance().getAllResourcePaths()) 
     { 
      classes.add(path.getAssociatedClass()); 
     } 
     return classes; 
    } 

} 

這裏的JSON響應的例子調用後 「/枚舉」:

{ 
"metadata":{ 
"code":200, 
"errorCode":200000, 
"userMessage":null, 
"developerMessage":null 
}, 
"content":[ 
{ 
"href":"http://localhost:8080/source/api/enums/status" 
}, 
{ 
"href":"http://localhost:8080/source/api/enums/role" 
}, 
{ 
"href":"http://localhost:8080/source/api/enums/license" 
}, 
{ 
"href":"http://localhost:8080/source/api/enums/selectedLicense" 
} 
} 

任何想法如何可以做到這一點?每個答案都非常感謝。

謝謝。

+1

某處,您可以維護所有可重用枚舉類的列表。然後,方法'Class#getEnumConstants()'應該是有用的。 –

+1

您正在傳遞恰好屬於枚舉類型的實體字段的名稱。例如,您應該傳遞枚舉完全限定的類名稱:'com.foo.bar.License'。 –

+0

是的,我同意。如果我可以有一個完全指定的類名,那將會容易得多。但我只需要一個簡單的類名。 – amenoire

回答

1

這是我會怎麼做:

Map<String, Class<Enum>> map = ... //Map <Enum name, Enum class> 

@SuppressWarnings("rawtypes") 
@GET 
@Path("/{enum}") 
@Produces(MediaType.APPLICATION_JSON) 
public Response enums(@PathParam("enum") String enumName){ 

    Class c = map.get(enumName); 
    if(c!=null) { 
    for(Enum e : c.getEnumConstants() { 
     LOGGER.info(e); 
    } 
    } 

} 

正如JB Nizet建議,你也可以指望得到枚舉的全名。在這種情況下,忘記地圖並使用反射來獲取枚舉類。

+0

聽起來像一個計劃。我明天會試一試,告訴你它是否有效。謝謝 – amenoire