Pourquoi "java.lang.IllegalStateException: La configuration de la ressource n'est pas modifiable dans ce contexte."
J'ai créé une application de mise en œuvre des services RESTE localement à l'aide d':
Eclipse Indigo
Maillot 2.4
Tomcat 7.0.47
Lors de l'exécution localement à l'aide d'Eclipse, les services de travail OK, mais lors du déploiement de mon fichier WAR, j'obtiens l'exception suivante lorsque vous essayez de faire un GET à l'un des services URL:
HTTP Status 500 - Servlet.init() for servlet com.app.rest.MyResourceConfig threw exception
type Exception report
message Servlet.init() for servlet com.app.rest.MyResourceConfig threw exception
description The server encountered an internal error that prevented it from fulfilling this request.
exception
javax.servlet.ServletException: Servlet.init() for servlet com.app.rest.MyResourceConfig threw exception
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002)
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
java.lang.Thread.run(Thread.java:662)
root cause
java.lang.IllegalStateException: The resource configuration is not modifiable in this context.
org.glassfish.jersey.server.ResourceConfig$ImmutableState.register(ResourceConfig.java:270)
org.glassfish.jersey.server.ResourceConfig$ImmutableState.register(ResourceConfig.java:218)
org.glassfish.jersey.server.ResourceConfig.register(ResourceConfig.java:448)
org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:300)
org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:167)
org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:349)
javax.servlet.GenericServlet.init(GenericServlet.java:160)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002)
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
java.lang.Thread.run(Thread.java:662)
J'ai été incapable de trouver encore l'une des causes et mon seul soupçon, c'est qu'il pourrait être un manque de course de dépendance ou de certains autres dans la configuration d'Eclipse qui diffèrent de mon propre serveur Tomcat de l'environnement et de l'Tomcat au serveur distant.
Mon code à la configuration des ressources de la classe est:
package com.app.rest;
import javax.ws.rs.ApplicationPath;
import org.glassfish.jersey.server.ResourceConfig;
import com.app.rest.services.RunDetailsService;
import com.app.rest.services.RunHistoryService;
import com.app.rest.services.RunPollService;
import com.app.rest.services.RunTestService;
@ApplicationPath("api")
public class MyResourceConfig extends ResourceConfig {
public MyResourceConfig() {
register(RunHistoryService.class).
register(RunTestService.class).
register(RunDetailsService.class).
register(RunPollService.class);
}
}
Que pensez-vous serait une cause possible?
source d'informationauteur Ghasfarost
Vous devez vous connecter pour publier un commentaire.
Une cause possible est que vous avez deux ou plus applicable mappages pour que les URL d'appel.
Par exemple:
@Path("/{myParam}")
Et ailleurs:
@Path("/{differentParam}")
Maintenant Jersey ont aucun moyen de savoir quelle méthode est censée être appelé et donne cette erreur.
J'ai réussi cause de la même erreur, et cela était dû à deux situations
1) La définition des chemins d'accès dans la limite des ressources ws ne DOIT PAS commencer par un "/xyz" juste "xyz" à ResourceConfig @ApplicationPath ("/")
2) se produit également en raison de la dépendance de l'API (jar) dans le .la guerre de projet ou tomcat/lib
3) Il se produit également lorsqu'il y a ambiguïté dans le chemin d'accès aux ressources (doublons même nom) est présenté dans le journal suivant: "AVERTISSEMENT: UN modèle de ressources a ambigu (sous-)méthode pour la méthode HTTP GET et entrée mime-types définis par @Consomme et @Produit des annotations en Java les méthodes public javax.ws.rs.de base.Réponse"
Netbeans 8.1, Apache Tomcat 8.0.12, JAX-RS 2.0 (jersey 2.12)
Affichage très fin pour quelqu'un qui bute sur ce problème. J'ai eu exactement le même problème - travaillé localement dans eclipse, mais quand j'ai essayé de déployer en dehors d'Eclipse, il s'est écrasé et a brûlé avec la même trace de la pile dans la question. Le problème était dû à double déploiement de notre webapps en raison d'un mauvais nommage des fichiers war nous avons été déploiement.
Quand autoDeploy est définie sur true, tomcat s'attend à un TRÈS spécifique de la convention d'affectation de noms .la guerre les fichiers qui sont liés au chemin de contexte. Par exemple, le chemin de contexte “/foo/bar” doit avoir un correspondant .la guerre fichier nommé “toto#bar.de la guerre”. En outre, un chemin de contexte mappée à “/” ou “” s'attend à une guerre de fichier appelé RACINE.guerre.
La dénomination complète les règles peuvent être trouvés ici: http://tomcat.apache.org/tomcat-7.0-doc/config/context.html#Naming
Fixant les noms des fichiers war résolu le problème.
Je tiens également à souligner que, finalement, eclipse également étouffé sur le problème pour moi. Parfois, faire un nettoyage du projet et essayer de ré-exécuter la volonté de résoudre le problème, mais pas tout le temps, et je ne sais pas pourquoi il la corrige. Je suis encore à essayer de trouver une solution complète. La résolution du problème pour eclipse est un peu plus difficile parce que (pour autant que je sais) je ne peux pas spécifier le nom du répertoire où eclipse publie le projet. Par exemple, un projet dans eclipse nommé "toto", dont la racine de contexte est "bar/baz" seront publiés dans un répertoire nommé "toto" plutôt que de "bar#baz" et tomcat/Jersey n'a pas l'air d'aimer cela.
J'espère que cela vous aide à sauver quelqu'un de la 12 heures, il m'a pris et mon équipe pour déboguer ce problème la nuit avant une démo 🙂
Dans mon cas, j'avais un Maillot POST de ressources pour l'upload de fichiers.
La ressource spécifié le paramètre:
@FormDataParam("file") InputStream file
et consommés MediaType.MULTIPART_FORM_DATA.
Pour résoudre le problème, j'ai dû ajouter le suivant pour le Maillot RESTE dans ma configuration web.xml fichier:
Ne sais pas si c'est encore un problème pour vous, mais j'ai récemment rencontré le même problème. Cependant, après avoir creuser plus loin dans mon code, j'ai découvert que cette erreur a été d'être jeté en raison de la signature de méthode suivante:
public void parseData(@FormParam("données") Collecte de données)
Une fois que j'avais suivi l'erreur à cette ligne, j'ai fait quelques googleing et découvert que l'utilisation de l' @FormParam avec la Collection<> ne fonctionne pas.
La solution est d'utiliser une Liste<> au lieu de cela:
public void parseData(@FormParam("données") les données de la Liste)
J'espère que ce sera utile à tout le monde de trouver ce post dans l'avenir, car le message d'erreur n'est vraiment pas très utile!
J'ai connu le même message d'erreur. J'ai posté à ce sujet dans mon blog (espagnol).
Lire les réponses ci-dessus, et en ajoutant ma propre expérience, je peux dire que si vous voyez cette exception jeté est en fait un problème d'initialisation. Regardez les changements de syntaxe ou d'un code qui est exécuté lors de l'initialisation. Vérifiez votre conteneur des journaux (comme catalina.sur Tomcat).
L'exception peut-être une conséquence d'exception lors de Jersey ne peut pas injecter certains type d'utilisateur par ex.
@QueryParam
/@PathParam
. E. g. vous n'avez pas enregistré votreParamConverterProvider
. Regardez ci-dessus dans les journaux, pour la première exception trace.J'ai résolu mon cas:
@Component
public static class JerseyConfig extends ResourceConfig {
public JerseyConfig() {
this.register(LocalDateParamProvider.class);
}
}
(J'utilise du Printemps.) Quand j'ai inséré ci-dessus
register()
appel, l'exception a disparu.Une autre raison possible pour obtenir que l'exception est si vous tentez de passer en paramètre de formulaire à l'aide de @FormParam avec un HTTP Get (@). Il devrait se plaindre puisque vous ne pouvez pas transmettre des données dans le corps du formulaire avec un HTTP Get. Un exemple de code qui permettrait de lever cette exception est...
Apparemment, les principales causes de l'échec est parce qu'il est double référence dans le chemin de services, c'est plusieurs path ("/"), ainsi que l'existence de ressources sans chemin d'accès ou telle ressource classes ne comptent pas Moins avec certains défini (@GET, @POST, @mise à JOUR, @SUPPRIMER, ...) de la méthode.
Afin de résoudre ce problème, un chemin (non reproduit) doit être indiqué pour chaque ressource et au moins à chaque ressource, il doit y avoir une ou plusieurs des méthodes publiées, l'absence de ces méthodes dans les différentes versions de jersey pourrait provoquer cette exception.
Exemple:
J'ai eu le même message d'erreur.
Pour moi, le problème, c'est que j'ai utilisé @RequestMapping (un Ressort annotation) au lieu de l' @QueryParam (JAX-RS annotation) sur l'argument d'une méthode en raison d'un copier coller.
Le message d'erreur n'était pas qu'instructif, mais c'était le problème pour moi.
J'ai résolu ce problème en ajoutant ce code dans web.xml fichier
Dans mon cas, c'était juste un manque
@PathParam("id")
pour la 'int id' déclaration.Mauvais code:
Code corrigé:
Essayez d'annuler le déploiement de la RACINE.la guerre dans le localhost:8080/manager e de les redéployer en GUERRE avec ce nom (de la RACINE.de la guerre), puis essayez à nouveau.
Qui a fonctionné pour moi.
Ajouter