Pergunta

Acho que é difícil colocar a pergunta exata em palavras, por isso vou apenas dar um exemplo.

Eu tenho um RESTO de serviço que permite visualizar todos os disponíveis Enums ao criar um link para cada um deles.Isso funciona OK.

Mas agora eu preciso encontrar uma maneira de apresentar de concreto os valores Enum em JSON quando um dos links fornecidos é clicado.

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

}

Aqui está um exemplo de resposta JSON, depois de chamar "/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"
}
}

Alguma idéia de como isso pode ser alcançado?Cada resposta é muito apreciada.

Obrigado.

Foi útil?

Solução

Esta é a forma como gostaria de fazê-lo :

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

}

Como sugerido por JB Nizet, você também pode esperar receber o nome totalmente qualificado do enum.Neste caso, esqueça o mapa e usar a reflexão para obter o enum classe.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top