JavaEE Как получить путь API из класса, объявив его

Использование: Java EE + JAX-RS (Apache Wink) + WAS.

Допустим, у меня есть Rest API, объявленный классом Hello, путь "/hello"

@Path("/hello")
public class Hello{

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response sayHello() {
        Map<String, String> myMap = new LinkedHashMap<String, String>();
        myMap.put("firstName", "To");
        myMap.put("lastName", "Kra");
        myMap.put("message", "Hello World!");
        Gson gson = new Gson(); 
        String json = gson.toJson(myMap);       
        return Response.status(200).entity(json).build();
   }
}

Как я могу получить этот путь от Hello.class без использования отражений? Я вижу пример в javax.ws.rs.core.UriBuilder метод path(Class clazz) который может получить это как-то, не может найти источники этого.

2 ответа

Решение

Решение с отражениями:

/**
 * Gets rest api path from its resource class
 * @param apiClazz
 * @return String rest api path
 */
public static String getRestApiPath(Class<?> apiClazz){
    Annotation[] annotations = apiClazz.getAnnotations();
    for(Annotation annotation : annotations){
        if(annotation instanceof Path){
            Path pathAnnotation = (Path) annotation;
            return pathAnnotation.value();
        }
    }
    return "";
}

Добавлять @Context либо вызов метода или класса и ввести либо HttpServletRequest или же UriInfoчто бы ни было более полезным, вот так:

// as class fields
@Context
private HttpServletRequest request;

@Context
private UriInfo uriInfo;
...

// or as param in method
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response sayHello(@Context UriInfo uriInfo) {
....

System.out.println(request.getRequestURI());
System.out.println("uri: " + uriInfo.getPath());
System.out.println("uri: " + uriInfo.getBaseUri());
Другие вопросы по тегам