2016-09-22 2 views
2

Мы использовали Resteasy 3.0.9 для наших веб-сервисов JAX-RS и недавно перешли на 3.0.19, где мы начали видеть много предупреждений RESTEASY002142: Multiple resource methods match request.Может ли Resteasy изучить тип параметра для методов JAX-RS?

К примеру, у нас есть такие методы, как:

@Path("/{id}") 
public String getSome(UUID id) 

@Path("/{id}") 
public String getSome(int id) 

Я не уверен, как это работает в 3.0.9, возможно, мы просто очень повезло, как кажется Resteasy выбрать первый метод из всех кандидатов (и 3.0.19).

Одним из решений является явно указать регулярное выражение: @Path("/{id : [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}}")

Но есть способ как-то сказать Resteasy разобраться в параметрах метода и построить соответствующее регулярное выражение автоматически?

ответ

2

Насколько я знаю, RESTEasy не учитывает тип параметра метода при рассмотрении запроса. Согласовывающ JSR-339 (что Resteasy реализует), это то, как работает процесс согласования запроса:

Запрос согласован с соответствующим методом ресурса или суб-ресурсов метода путем сравнения нормализованного URI запроса, тип носителя любой объект запроса и запрошенный ответ формат сущности для аннотаций метаданных в классах ресурсов и их методах. Если не найден подходящий метод метода или под-ресурса, возвращается соответствующий ответ об ошибке. [...]

Реализации JAX-RS должны соответствовать запрошенному URI с помощью значений аннотаций @Path. В значении аннотации @Path вы можете определить переменные, которые обозначаются фигурными скобками ({ и }).

В рамках согласования запроса, реализация JAX-RS будет заменить каждый переменный шаблон URI с регулярным выражением или ([ˆ/]+?), если не указано регулярное выражение.

Для решения этой ситуации, вы упомянули в вашем вопросе, вы должны указать регулярное выражение, чтобы соответствовать UUID, по методу один ресурса:

@Path("{id : [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}}") 

И вы можете также рассмотреть регулярное выражение для соответствия чисел на другом методе ресурса:

@Path("{id : \\d+}") 
+0

Спасибо за ответ. Тем не менее, это не отвечает на вопрос полностью. Спецификация JAX-RS 2.0 не запрещает реализации для просмотра типов параметров во время шага 2 сопоставления запросов: Для каждого класса Z в C добавьте регулярные выражения в E для каждого метода и локатора подресурса следующим образом: i. Для каждого метода субресурсов D добавьте R (TD), где TD является шаблоном пути URI метода подресурсов. Restaasy уже преобразует шаблоны, такие как '' '/ things/{id}' '' в регулярные выражения. Таким образом, существует возможность для регулярных выражений типа. – relgames

+0

Итак, часть «По крайней мере, не должна» неверна, согласно спецификации JAX-RS 2.0. Если я ошибаюсь, укажите мне точное место, где спецификация запрещает его. – relgames

+0

@relgames JAX-RS 2.0 указывает, что реализациям не требуется использовать алгоритм, как указано в спецификации, но должен приводить к результатам, эквивалентным результатам, полученным алгоритмом, описанным в спецификации. Спецификация JAX-RS 2.0 не запрещает реализации для изучения параметров типов методов, и, насколько я знаю, RESTEasy этого не делает. –