2013-04-02 12 views
5

Po uaktualnieniu Jersey z wersji 1.15 do 1.17 zaczęło się zalogować następujące komunikaty:Jersey: co oznacza "nie można znaleźć elementu gramatyki"?

Apr 2, 2013 5:13:06 PM com.sun.jersey.server.wadl.generators.AbstractWadlGeneratorGrammarGenerator attachTypes 
INFO: Couldn't find grammar element for class java.lang.String 

Przykładem usługi, która produkuje taką wiadomość:

@GET 
@Path("/bla/{a}") 
@Produces("application/json") 
public String doStuff(@PathParam("a") String a) { 
    return a; 
} 

Moje pierwsze wrażenie byłoby rozważyć jest to komunikat o błędzie, oparty wyłącznie na sposobie sformułowania komunikatu ("nie można znaleźć"). Jednak jest on rejestrowany na poziomie INFO i nie wydaje się, aby miał on jakiekolwiek efekty, ponieważ wszystkie usługi nadal działają.

Moje pytanie brzmi, czy te komunikaty logowania wskazują na (potencjalny) problem ze sposobem, w jaki konfigurujemy lub korzystamy z usługi Jersey. Ponieważ nie miało to miejsca w poprzedniej wersji, sprawdziłem już informacje o wydaniu, ale nie znalazłem nic powiązanego.

+0

Niestety, ja pomieszane przykładowego kodu podczas anonimizujących go. Napraw to teraz. –

Odpowiedz

10

Miałem ten sam komunikat "info". Nie udało mi się go naprawić (jeszcze) dla podstawowych typów java (Boolean, String ...), ale dla własnych klas niestandardowych, jeśli dodaję adnotację @XmlRootElement i domyślny konstruktor no-param, komunikat zniknie.

kopanie w kodzie źródłowym Koszulka zauważyłem klasy „WadlGeneratorJAXBGrammarGenerator” następujący kod:

Object parameterClassInstance = null; 
try { 
    Constructor<?> defaultConstructor = type.getDeclaredConstructor(); 
    defaultConstructor.setAccessible(true); 
    parameterClassInstance = defaultConstructor.newInstance(); 
} catch (InstantiationException ex) { 
    LOGGER.log(Level.FINE, null, ex); 
} catch (IllegalAccessException ex) { 
    LOGGER.log(Level.FINE, null, ex); 
} catch (IllegalArgumentException ex) { 
    LOGGER.log(Level.FINE, null, ex); 
} catch (InvocationTargetException ex) { 
    LOGGER.log(Level.FINE, null, ex); 
} catch (SecurityException ex) { 
    LOGGER.log(Level.FINE, null, ex); 
} catch (NoSuchMethodException ex) { 
    //getting here for Boolean/String and some other primitive data type 
    LOGGER.log(Level.FINE, null, ex); 
} 

if (parameterClassInstance==null) { 
    return null; 
} 

Więc w zasadzie nie ma domyślnego konstruktora String, Boolean i kilku innych to rzuca NoSuchMethodException dlatego powrót null i zaloguj wiadomość informacyjną.

Wciąż nie mam pojęcia, dlaczego tak się dzieje, ale w moim przypadku rozwiązaniem było wyłączenie generacji wadl, ponieważ jej nie używałem. Wystarczy dodać następujące param do web.xml

<init-param> 
     <param-name>com.sun.jersey.config.feature.DisableWADL</param-name> 
     <param-value>true</param-value> 
    </init-param> 
+0

Czy wstawiasz do init-param tylko w swoim web.xml, czy łączysz go z jakimś wpisem? – confile

+0

Tak w pliku web.xml wewnątrz elementu serwletu koszulki –