【发布时间】:2014-02-27 17:07:32
【问题描述】:
我觉得很难用语言表达确切的问题,所以我只举一个例子。
我有一个 REST 服务,它允许通过为每个枚举创建一个链接来查看所有可用的枚举。这工作正常。
但是现在我需要找到一种方法来在单击提供的链接之一时以 JSON 格式显示具体的 Enum 值。
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"
}
}
有什么想法可以实现吗?非常感谢每一个答案。
谢谢。
【问题讨论】:
-
在某个地方,您可以维护所有可访问枚举类的列表。那么,
Class#getEnumConstants()方法应该是有用的。 -
您正在传递一个实体字段的名称,该实体恰好是枚举类型。您应该传递枚举完全限定的类名:例如
com.foo.bar.License。 -
是的,我同意。如果我可以有一个完全指定的类名,那会容易得多。但我只需要一个简单的类名。
-
然后找到具有这个简单名称的枚举类(希望它是唯一的)(使用 Map,或通过遍历枚举类)。但是你需要传递枚举类的简单名称,而不是实体的字段名称。
标签: json rest jakarta-ee enums jax-rs