J'utilise l'API Jersey pour les services Web. J'envoie les données en plusieurs parties du client au serveur. Je reçois une exception lorsque les services Web commencent à s'exécuter.
@POST
@Path("uploadphoto")
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces("text/plain")
public String uploadNotices(@FormDataParam("file") InputStream uploadedInputStream, @FormDataParam("file") FormDataContentDisposition fileDetail) {
String uploadedFileLocation = "d:/" + fileDetail.getFileName();
// save it
try {
writeToFile(uploadedInputStream, uploadedFileLocation);
} catch(Exception e) {
return "no";
}
return "yes";
}
// save uploaded file to new location
private void writeToFile(InputStream uploadedInputStream, String uploadedFileLocation) throws Exception {
OutputStream out = new FileOutputStream(new File(uploadedFileLocation));
int read = 0;
byte[] bytes = new byte[1024];
out = new FileOutputStream(new File(uploadedFileLocation));
while ((read = uploadedInputStream.read(bytes)) != -1) {
out.write(bytes, 0, read);
}
out.flush();
out.close();
}
Trace de la pile:
SEVERE: The following errors and warnings have been detected with resource and/or provider classes:
SEVERE: Missing dependency for method public Java.lang.String com.homebulletin.resources.NoticeResources.uploadNotices(Java.io.InputStream,com.Sun.jersey.core.header.FormDataContentDisposition) at parameter at index 0
SEVERE: Missing dependency for method public Java.lang.String com.homebulletin.resources.NoticeResources.uploadNotices(Java.io.InputStream,com.Sun.jersey.core.header.FormDataContentDisposition) at parameter at index 1
SEVERE: Method, public Java.lang.String com.homebulletin.resources.NoticeResources.uploadNotices(Java.io.InputStream,com.Sun.jersey.core.header.FormDataContentDisposition), annotated with POST of resource, class com.homebulletin.resources.NoticeResources, is not recognized as valid resource method.
Jun 18, 2013 10:55:17 AM org.Apache.catalina.core.ApplicationContext log
SEVERE: StandardWrapper.Throwable
com.Sun.jersey.spi.inject.Errors$ErrorMessagesException
at com.Sun.jersey.spi.inject.Errors.processErrorMessages(Errors.Java:170)
at com.Sun.jersey.spi.inject.Errors.postProcess(Errors.Java:136)
at com.Sun.jersey.spi.inject.Errors.processWithErrors(Errors.Java:199)
at com.Sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.Java:765)
at com.Sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.Java:760)
at com.Sun.jersey.spi.container.servlet.ServletContainer.initiate(ServletContainer.Java:489)
at com.Sun.jersey.spi.container.servlet.ServletContainer$InternalWebComponent.initiate(ServletContainer.Java:319)
at com.Sun.jersey.spi.container.servlet.WebComponent.load(WebComponent.Java:609)
at com.Sun.jersey.spi.container.servlet.WebComponent.init(WebComponent.Java:210)
at com.Sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.Java:374)
at com.Sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.Java:557)
at javax.servlet.GenericServlet.init(GenericServlet.Java:212)
at org.Apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.Java:1161)
at org.Apache.catalina.core.StandardWrapper.allocate(StandardWrapper.Java:806)
at org.Apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.Java:129)
at org.Apache.catalina.core.StandardContextValve.invoke(StandardContextValve.Java:175)
at org.Apache.catalina.core.StandardHostValve.invoke(StandardHostValve.Java:128)
at org.Apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.Java:102)
at org.Apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.Java:109)
at org.Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:286)
at org.Apache.coyote.http11.Http11Processor.process(Http11Processor.Java:844)
at org.Apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.Java:583)
at org.Apache.Tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.Java:447)
at Java.lang.Thread.run(Unknown Source)
Jun 18, 2013 10:55:17 AM org.Apache.catalina.core.StandardWrapperValve invoke
SEVERE: Allocate exception for servlet Home Bulletin
com.Sun.jersey.spi.inject.Errors$ErrorMessagesException
at com.Sun.jersey.spi.inject.Errors.processErrorMessages(Errors.Java:170)
at com.Sun.jersey.spi.inject.Errors.postProcess(Errors.Java:136)
at com.Sun.jersey.spi.inject.Errors.processWithErrors(Errors.Java:199)
at com.Sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.Java:765)
at com.Sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.Java:760)
at com.Sun.jersey.spi.container.servlet.ServletContainer.initiate(ServletContainer.Java:489)
at com.Sun.jersey.spi.container.servlet.ServletContainer$InternalWebComponent.initiate(ServletContainer.Java:319)
at com.Sun.jersey.spi.container.servlet.WebComponent.load(WebComponent.Java:609)
at com.Sun.jersey.spi.container.servlet.WebComponent.init(WebComponent.Java:210)
at com.Sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.Java:374)
at com.Sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.Java:557)
at javax.servlet.GenericServlet.init(GenericServlet.Java:212)
at org.Apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.Java:1161)
at org.Apache.catalina.core.StandardWrapper.allocate(StandardWrapper.Java:806)
at org.Apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.Java:129)
at org.Apache.catalina.core.StandardContextValve.invoke(StandardContextValve.Java:175)
at org.Apache.catalina.core.StandardHostValve.invoke(StandardHostValve.Java:128)
at org.Apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.Java:102)
at org.Apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.Java:109)
at org.Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:286)
at org.Apache.coyote.http11.Http11Processor.process(Http11Processor.Java:844)
at org.Apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.Java:583)
at org.Apache.Tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.Java:447)
at Java.lang.Thread.run(Unknown Source)
Il semble que vos quelques pots manquants dans votre projet. Essayez de les ajouter à votre projet:
jersey-multipart.jar
mimepull.jar
Si vous utilisez maven, vous pouvez ajouter cette dépendance:
<dependency>
<groupId>com.Sun.jersey.contribs</groupId>
<artifactId>jersey-multipart</artifactId>
<version>1.8</version>
</dependency>
Changer la version de jar si vous avez besoin
Assurez-vous également que la version de votre jersey-multipart jar doit être identique à celle du jersey bundle jar
Oublier d'ajouter @POST
ou @Get
en plus du nom de la méthode provoquera également cette erreur
Il m'a fait face à la même erreur parce qu'avoir les mêmes annotations @Path avec les mêmes noms de chemin (chaînes).
@Path('samepath') /// samepath cause Jersey Error at run time.
/* Method 1*/
@Path('samepath')
/* Method 2 */
J'ai vu exactement la même erreur en utilisant @FormParam
(qui s'attend à @POST
) avec les paramètres @GET
.
J'espère que cela aidera quelqu'un car ce n'était pas très intuitif de le savoir.
com.Sun.jersey.spi.inject.Errors $ ErrorMessagesException
s'est produite lorsque j'avais deux méthodes @GET
avec le même chemin mais des paramètres de requête différents.
Cela peut aussi arriver si vous renommez votre classe de contrôleur, faites mvn install
sans mvn clean
et mettez le fichier war dans le dossier /webapps
.
Remplacez votre web.xml
par ce code:
<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class> org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey Web Application</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
Je sais que c'est trop tard. Mais la mise à jour ici pour les références futures. Mieux vaut vérifier les versions de jar. J'ai eu le même problème. J'utilisais la version 1.16 du noyau et du serveur de jersey, mais celui-ci que j'ai ajouté avec 1.18. Cela a donné la même erreur. Mais ensuite j'ai réalisé et changé à 1,16, puis a bien fonctionné.
Cela ne fonctionne pas avec différentes versions.
J'ai eu un problème similaire car je n'ai pas réussi à ajouter une annotation "Consume" pour ma méthode POST. J'espère que ça aide quelqu'un.
J'ai rencontré ce problème parce que je n'avais pas de constructeur de paramètres dans ma classe
@Path("/deviceconfigs")
public class DeviceConfigInterface extends ComInterfaceGen<DeviceConfigApi> {
public DeviceConfigInterface(Class<DeviceConfigApi> type) {
super(DeviceConfigApi.class);
}
}.
Lorsque je n'utilise aucun constructeur de paramètres, le problème est résolu.