使用JAX-RS(Jersey)从其名称中获取Enum值

时间:2014-02-27 17:07:32

标签: json rest java-ee enums 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;
    }

}

以下是调用“/ enums”后的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 个答案:

答案 0 :(得分:2)

我就是这样做的:

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的建议,您还可以获得枚举的完全限定名称。在这种情况下,忘记地图并使用反射来获取枚举类。