Pregunta

Me resulta difícil poner la pregunta exacta en palabras, así que solo daré un ejemplo.

Tengo un servicio de descanso que permite ver todos los enumanos disponibles creando un enlace para cada uno de ellos.Esto funciona bien.

Pero ahora necesito encontrar una manera de mostrar un enumeración de concreto en JSON cuando se hace clic en uno de los enlaces provistos.

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;
    }

}

Aquí hay un ejemplo de la respuesta de JSON después de llamar "/ Enums":

{
"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"
}
}

¿Alguna idea de cómo se puede lograr esto?Cada respuesta es muy apreciada.

gracias.

¿Fue útil?

Solución

Así es como lo haría:

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); 
    }
  }

}

Según lo sugerido por JB Nizet, también podría esperar recibir el nombre completamente calificado de la Enum.En este caso, olvídese el mapa y use la reflexión para obtener la clase enum.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top