java - Mailgun + Java 找不到反序列化器

标签 java playframework-2.0 mailgun

我正在尝试将 MailGun API 集成到我的 Play2Java 应用程序中。电子邮件已成功发送,但抛出异常。

这是我的 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"

这是我发送电子邮件的简单方法:

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 <myemail@gmail.com>");
        reqData.param("to", "myemail@gmail.com");
        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);
    }

我收到此错误。顺便说一句,电子邮件已成功发送...

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.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@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.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@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]

最佳答案

我在使用 MailGun 时遇到了类似的问题。我认为他们的 Java 文档有点过时了。当 Jersey 尝试解析响应时会发生错误。省略回复对我有用:

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

我发现以下包装库有助于研究他们的方法:https://github.com/sargue/mailgun

不幸的是,我使用同步或异步方法都没有得到任何响应。

关于java - Mailgun + Java 找不到反序列化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42542417/

相关文章:

playframework - Play Framework - 未找到驱动程序 : [com. mysql.jdbc.Driver] - intelliJ

java - 使用 play/Ebean 将数据保存到数据库中的问题

java - 玩!框架与 Ruby on Rails

java - 对象映射错误 - Java

java - 使用 Intent 或在 Android 中使用静态方法从一个 Activity 访问数据到另一个 Activity ?

java - 如何获得实时日志分析

node.js - Mailgun webhook POST 正文似乎是空的

php - Laravel 5 尝试获取非对象电子邮件的属性

java - 如何使用入站解析捕获 OOO(不在办公室)电子邮件?

java - 在 Java 中使用 FOR 循环并对各轮之间的值求和