2017-03-01 6 views
1

J'essaie d'intégrer l'API MailGun dans mon application Play2Java. L'email est envoyé avec succès mais l'exeption est lancée.Mailgun + Java ne peut pas trouver de désérialiseur

Ceci est mon build.sbt

// https://mvnrepository.com/artifact/org.glassfish.jersey.core/jersey-client 
libraryDependencies += "org.glassfish.jersey.core" % "jersey-client" % "2.25.1" 

// https://mvnrepository.com/artifact/org.glassfish.jersey.media/jersey-media-multipart 
libraryDependencies += "org.glassfish.jersey.media" % "jersey-media-multipart" % "2.25.1" 

// https://mvnrepository.com/artifact/org.glassfish.jersey.media/jersey-media-json-jackson 
libraryDependencies += "org.glassfish.jersey.media" % "jersey-media-json-jackson" % "2.25.1" 

Ceci est ma méthode simple pour envoyer des e-mail:

public static ClientResponse SendSimple() { 

     Client client = ClientBuilder.newClient(); 
     client.register(HttpAuthenticationFeature.basic(
       "api", 
       "mykey" 
     )); 

     WebTarget mgRoot = client.target("https://api.mailgun.net/v3"); 

     Form reqData = new Form(); 
     reqData.param("from", "Excited User <[email protected]>"); 
     reqData.param("to", "[email protected]"); 
     reqData.param("subject", "Hello"); 
     reqData.param("text", "Testing out some Mailgun awesomeness!"); 

     return mgRoot 
       .path("/{domain}/messages") 
       .resolveTemplate("domain", "mydomain") 
       .request(MediaType.APPLICATION_FORM_URLENCODED) 
       .buildPost(Entity.entity(reqData, MediaType.APPLICATION_FORM_URLENCODED)) 
       .invoke(ClientResponse.class); 
    } 

et je reçois cette erreur. Btw, email est envoyé avec succès ...

22:19:18 worker.1 | javax.ws.rs.client.ResponseProcessingException: com.fasterxml.jackson.databind.JsonMappingException: Can not find a deserializer for non-concrete Map type [map type; class j 
pe, class java.lang.String] -> [collection type; class java.util.List, contains [simple type, class java.lang.Object]]] 
22:19:18 worker.1 | at [Source: org.glassfish.jersey.me[email protected]291c3876; line: 1, column: 1] 
22:19:18 worker.1 |  at org.glassfish.jersey.client.JerseyInvocation.translate(JerseyInvocation.java:809) ~[jersey-client-2.25.1.jar:na] 
22:19:18 worker.1 |  at org.glassfish.jersey.client.JerseyInvocation.access$700(JerseyInvocation.java:92) ~[jersey-client-2.25.1.jar:na] 
22:19:18 worker.1 |  at org.glassfish.jersey.client.JerseyInvocation$2.call(JerseyInvocation.java:701) ~[jersey-client-2.25.1.jar:na] 
22:19:18 worker.1 |  at org.glassfish.jersey.internal.Errors.process(Errors.java:315) ~[jersey-common-2.25.1.jar:na] 
22:19:18 worker.1 |  at org.glassfish.jersey.internal.Errors.process(Errors.java:297) ~[jersey-common-2.25.1.jar:na] 
22:19:18 worker.1 |  at org.glassfish.jersey.internal.Errors.process(Errors.java:228) ~[jersey-common-2.25.1.jar:na] 
22:19:18 worker.1 |  at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:444) ~[jersey-common-2.25.1.jar:na] 
22:19:18 worker.1 |  at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:697) ~[jersey-client-2.25.1.jar:na] 
22:19:18 worker.1 |  at utils.EmailUtilsMailGun.SendSimple(EmailUtilsMailGun.java:37) ~[classes/:na] 
22:19:18 worker.1 |  at controllers.PaymentsController.addMassRecords(PaymentsController.java:64) ~[classes/:2.4.6] 
22:19:18 worker.1 |  at router.Routes$$anonfun$routes$1$$anonfun$applyOrElse$59$$anonfun$apply$59.apply(Routes.scala:2204) ~[classes/:na] 
22:19:18 worker.1 |  at router.Routes$$anonfun$routes$1$$anonfun$applyOrElse$59$$anonfun$apply$59.apply(Routes.scala:2204) ~[classes/:na] 
22:19:18 worker.1 |  at play.core.routing.HandlerInvokerFactory$$anon$4.resultCall(HandlerInvoker.scala:136) ~[play_2.11-2.4.6.jar:2.4.6] 
22:19:18 worker.1 |  at play.core.routing.HandlerInvokerFactory$JavaActionInvokerFactory$$anon$14$$anon$3$$anon$1.invocation(HandlerInvoker.scala:127) ~[play_2.11-2.4.6.jar:2.4.6] 
22:19:18 worker.1 |  at play.core.j.JavaAction$$anon$1.call(JavaAction.scala:70) ~[play_2.11-2.4.6.jar:2.4.6] 
22:19:18 worker.1 |  at play.http.DefaultHttpRequestHandler$1.call(DefaultHttpRequestHandler.java:20) ~[play_2.11-2.4.6.jar:2.4.6] 
22:19:18 worker.1 |  at play.mvc.Security$AuthenticatedAction.call(Security.java:56) ~[play_2.11-2.4.6.jar:2.4.6] 
22:19:18 worker.1 |  at play.db.jpa.TransactionalAction.lambda$call$5(TransactionalAction.java:19) ~[play-java-jpa_2.11-2.4.6.jar:2.4.6] 
22:19:18 worker.1 |  at play.db.jpa.TransactionalAction$$Lambda$39/274518141.apply(Unknown Source) ~[na:na] 
22:19:18 worker.1 |  at play.db.jpa.DefaultJPAApi.withTransaction(DefaultJPAApi.java:136) ~[play-java-jpa_2.11-2.4.6.jar:2.4.6] 
22:19:18 worker.1 |  at play.db.jpa.JPA.withTransaction(JPA.java:159) ~[play-java-jpa_2.11-2.4.6.jar:2.4.6] 
22:19:18 worker.1 |  at play.db.jpa.TransactionalAction.call(TransactionalAction.java:16) ~[play-java-jpa_2.11-2.4.6.jar:2.4.6] 
22:19:18 worker.1 |  at play.core.j.JavaAction$$anonfun$7.apply(JavaAction.scala:94) ~[play_2.11-2.4.6.jar:2.4.6] 
22:19:18 worker.1 |  at play.core.j.JavaAction$$anonfun$7.apply(JavaAction.scala:94) ~[play_2.11-2.4.6.jar:2.4.6] 
22:19:18 worker.1 |  at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24) ~[scala-library-2.11.6.jar:na] 
22:19:18 worker.1 |  at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24) ~[scala-library-2.11.6.jar:na] 
22:19:18 worker.1 |  at play.core.j.HttpExecutionContext$$anon$2.run(HttpExecutionContext.scala:40) ~[play_2.11-2.4.6.jar:2.4.6] 
22:19:18 worker.1 |  at play.api.libs.iteratee.Execution$trampoline$.execute(Execution.scala:70) ~[play-iteratees_2.11-2.4.6.jar:2.4.6] 
22:19:18 worker.1 |  at play.core.j.HttpExecutionContext.execute(HttpExecutionContext.scala:32) ~[play_2.11-2.4.6.jar:2.4.6] 
22:19:18 worker.1 |  at scala.concurrent.impl.Future$.apply(Future.scala:31) ~[scala-library-2.11.6.jar:na] 
22:19:18 worker.1 |  at scala.concurrent.Future$.apply(Future.scala:492) ~[scala-library-2.11.6.jar:na] 
22:19:18 worker.1 |  at play.core.j.JavaAction.apply(JavaAction.scala:94) ~[play_2.11-2.4.6.jar:2.4.6] 
22:19:18 worker.1 |  at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4$$anonfun$apply$5.apply(Action.scala:105) ~[play_2.11-2.4.6.jar:2.4.6] 
22:19:18 worker.1 |  at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4$$anonfun$apply$5.apply(Action.scala:105) ~[play_2.11-2.4.6.jar:2.4.6] 
22:19:18 worker.1 |  at play.utils.Threads$.withContextClassLoader(Threads.scala:21) ~[play_2.11-2.4.6.jar:2.4.6] 
22:19:18 worker.1 |  at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4.apply(Action.scala:104) ~[play_2.11-2.4.6.jar:2.4.6] 
22:19:18 worker.1 |  at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4.apply(Action.scala:103) ~[play_2.11-2.4.6.jar:2.4.6] 
22:19:18 worker.1 |  at scala.Option.map(Option.scala:146) ~[scala-library-2.11.6.jar:na] 
22:19:18 worker.1 |  at play.api.mvc.Action$$anonfun$apply$1.apply(Action.scala:103) ~[play_2.11-2.4.6.jar:2.4.6] 
22:19:18 worker.1 |  at play.api.mvc.Action$$anonfun$apply$1.apply(Action.scala:96) ~[play_2.11-2.4.6.jar:2.4.6] 
22:19:18 worker.1 |  at play.api.libs.iteratee.Iteratee$$anonfun$mapM$1.apply(Iteratee.scala:524) ~[play-iteratees_2.11-2.4.6.jar:2.4.6] 
22:19:18 worker.1 |  at play.api.libs.iteratee.Iteratee$$anonfun$mapM$1.apply(Iteratee.scala:524) ~[play-iteratees_2.11-2.4.6.jar:2.4.6] 
22:19:18 worker.1 |  at play.api.libs.iteratee.Iteratee$$anonfun$flatMapM$1.apply(Iteratee.scala:560) ~[play-iteratees_2.11-2.4.6.jar:2.4.6] 
22:19:18 worker.1 |  at play.api.libs.iteratee.Iteratee$$anonfun$flatMapM$1.apply(Iteratee.scala:560) ~[play-iteratees_2.11-2.4.6.jar:2.4.6] 
22:19:18 worker.1 |  at play.api.libs.iteratee.Iteratee$$anonfun$flatMap$1$$anonfun$apply$14.apply(Iteratee.scala:537) ~[play-iteratees_2.11-2.4.6.jar:2.4.6] 
22:19:18 worker.1 |  at play.api.libs.iteratee.Iteratee$$anonfun$flatMap$1$$anonfun$apply$14.apply(Iteratee.scala:537) ~[play-iteratees_2.11-2.4.6.jar:2.4.6] 
22:19:18 worker.1 |  at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24) ~[scala-library-2.11.6.jar:na] 
22:19:18 worker.1 |  at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24) ~[scala-library-2.11.6.jar:na] 
22:19:18 worker.1 |  at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:40) [akka-actor_2.11-2.3.13.jar:na] 
22:19:18 worker.1 |  at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:397) [akka-actor_2.11-2.3.13.jar:na] 
22:19:18 worker.1 |  at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) [scala-library-2.11.6.jar:na] 
22:19:18 worker.1 |  at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) [scala-library-2.11.6.jar:na] 
22:19:18 worker.1 |  at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) [scala-library-2.11.6.jar:na] 
22:19:18 worker.1 |  at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) [scala-library-2.11.6.jar:na] 
22:19:18 worker.1 | Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not find a deserializer for non-concrete Map type [map type; class javax.ws.rs.core.MultivaluedMap, [simp 
ction type; class java.util.List, contains [simple type, class java.lang.Object]]] 
22:19:18 worker.1 | at [Source: org.glassfish.jersey.me[email protected]291c3876; line: 1, column: 1] 
22:19:18 worker.1 |  at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:305) ~[jackson-databind-2.8.4.jar:2.8.4] 
22:19:18 worker.1 |  at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:268) ~[jackson-databind-2.8.4.jar:2.8.4] 
22:19:18 worker.1 |  at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244) ~[jackson-databind-2.8.4.jar:2.8.4] 
22:19:18 worker.1 |  at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142) ~[jackson-databind-2.8.4.jar:2.8.4] 
22:19:18 worker.1 |  at com.fasterxml.jackson.databind.DeserializationContext.findContextualValueDeserializer(DeserializationContext.java:443) ~[jackson-databind-2.8.4.jar:2.8.4] 
22:19:18 worker.1 |  at com.fasterxml.jackson.databind.deser.std.StdDeserializer.findDeserializer(StdDeserializer.java:965) ~[jackson-databind-2.8.4.jar:2.8.4] 
22:19:18 worker.1 |  at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.resolve(BeanDeserializerBase.java:501) ~[jackson-databind-2.8.4.jar:2.8.4] 

Répondre

0

J'ai eu un problème similaire en utilisant MailGun. Je suppose que leur documentation pour Java est un peu obsolète. L'erreur se produit lorsque Jersey tente d'analyser la réponse. Omettre la Reponse a fonctionné pour moi:

return mgRoot 
      .path("/{domain}/messages") 
      .resolveTemplate("domain", "mydomain") 
      .request() 
      .post(Entity.entity(reqData, MediaType.APPLICATION_FORM_URLENCODED)); 

Je trouve la bibliothèque wrapper utile de se pencher sur leur approche: https://github.com/sargue/mailgun

Malheureusement je ne reçois pas de réponse à l'aide soit synchrone ou l'approche asynchrone.