2013-08-29 2 views
0

Используя предыдущую версию Джерси (~ 1.12), я использовал для сравнения «данные» элемента литерала с одной аннотацией, если он произошел в конце пути, и другой аннотацию, если это было где-то еще:Сопоставление последнего элемента пути с использованием аннотации JaxRS @Path в Джерси

@Path("data$") 
public Object getDataResource(@Context UriInfo uriInfo) { 
    // Matched when 'data' is the last path element 
    ... 
} 

@Path("{name}") 
public Object getNamedResource(@Context UriInfo uriInfo) { 
    // Matched when 'data' is not the last path element 
    ... 
} 

в какой-то момент между 1.12 и 1.17, это поведение изменилось и персонаж «$» теперь бежал до того, как шаблон применяется к входящему URI. Теперь первый метод (getDataResource) никогда не сопоставляется.

Например, при сопоставлении http://.../data/data я ожидаю, что getNamedResource соответствует первым «данным» и getDataResource, чтобы соответствовать второму «данным». Вместо этого getNamedResource теперь соответствует обоим.

  1. Могу ли я вернуться к старому поведению, в котором я несу ответственность за выход из моего регулярного выражения?
  2. Есть ли новый/лучший/другой метод для сопоставления только последнего элемента пути в URI?
+0

Вы можете попытаться использовать '@ Encoded' в методе« data $ ». –

ответ

0

Лучшее решение, которое я нашел, - это определить вручную, когда второй метод соответствует последнему элементу пути и вручную делегирует его первому.

@Path("{name}") 
public Object getNamedResource(@Context UriInfo uriInfo) { 
    boolean lastElement = uriInfo.getMatchedURIs() 
          .iterator().next().equals(uriInfo.getPath()); 
    if (lastElement && "data".equals(name)) { 
     return getDataResource(uriInfo); 
    } 
    ... 
} 

Не плохое решение моей конкретной проблемы, но я все еще расстроен, что Джерси спасаясь мой образец, не спрашивая меня первым.