2015-05-12 2 views
2

Мы видели это несколько раз, и это, похоже, не связано с нашим кодом, так как ни один из наших кодов не находится в stacktrace. Мы используем Джерси 1.17 и мы получаем, иногда эту ошибку:Ошибка Odd Jersey: java.lang.StackOverflowError

java.lang.StackOverflowError at java.lang.String.toLowerCase(String.java:2496) at com.sun.jersey.core.util.StringIgnoreCaseKeyComparator.hash(StringIgnoreCaseKeyComparator.java:53) at com.sun.jersey.core.util.StringIgnoreCaseKeyComparator.hash(StringIgnoreCaseKeyComparator.java:48) at com.sun.jersey.core.util.KeyComparatorHashMap.keyComparatorHash(KeyComparatorHashMap.java:294) at com.sun.jersey.core.util.KeyComparatorHashMap.containsKey(KeyComparatorHashMap.java:359) at com.sun.jersey.api.client.filter.HTTPBasicAuthFilter.handle(HTTPBasicAuthFilter.java:101) at com.sun.jersey.api.client.filter.HTTPBasicAuthFilter.handle(HTTPBasicAuthFilter.java:104) at com.sun.jersey.api.client.filter.HTTPBasicAuthFilter.handle(HTTPBasicAuthFilter.java:104) at ...

И тогда последняя строка повторяется навсегда (ну, пока StackOverflow). Мы видели это больше в 1.18, и поэтому мы понизились до 1.17, но теперь я только что увидел его там.

Эти веб-службы работают в 99,9% случаев. Это вызывает проблемы в jvm. Кто-нибудь еще видел это? Что я делаю не так? У нас просто нормальная установка 1.17, и вокруг нее построено все приложение.

Обновление: так как кто-то предложил цикл на сервере приложений, мы используем Tomcat 6 и basic auth.

+1

И что код в 'HTTPBasicAuthFilter.java: 104'? – fge

+0

Вы пытаетесь выполнить аутентификацию, с какой-то петлей. Иногда Auth фильтрует петлю на них, вам нужно остановить их в случае ошибки. 1. вызов auth клиентом, 2. вызов auth в приложении 3. потребности в услугах Auth, 4. Auth Call .... это может легко сделать цикл – jeorfevre

+0

Мы не делаем auth в приложении, которое я знаю (мы используем tomcat, и он выполняет базовый auth). Кроме того, если вы заметили выше, остальная часть огромной трассировки стека находится в строке 104. Таким образом, первый из них 101, а остальные - 104. – markthegrea

ответ

1

Так что мой приятель нашел это, и я не могу поверить своей собственной глупости.

this.theBasicAuthClient.addFilter(new HTTPBasicAuthFilter(logon, password)); 

Я добавлял это при каждом вызове. Поэтому мы делаем клиента в конструкторе нашего класса и повторно используем его. Попутно я думал, что это просто добавило основные учетные данные авторизации в заголовке запроса, но на самом деле добавляет еще один фильтр. Поэтому каждый раз, когда мы выполняли этот клиентский звонок, мы добавляли еще один фильтр! GAA!

Просто добавьте его при создании клиента и двигаться дальше ...

Смежные вопросы