【问题标题】:Official supercsv dozer example does not work with Play — Play 2.1.1, Java官方 supercsv dozer 示例不适用于 Play — Play 2.1.1,Java
【发布时间】:2013-09-06 08:49:25
【问题描述】:

更新:

现在我发现了一个很奇怪的东西,当我直接把编译好的测试类放上去的时候就可以了 进入“super-csv-dozer-2.1.0.jar”,其结构与 svn repo 中的相同。 但是一旦我使用我自己的包,它就不起作用了。我总是使用整个路径 像这样:myPackage.csv.SurveyResponse.class 我错过了什么?为什么它可以在普通的 Java 项目中工作,但不能在 Play 项目中工作? 我还在 eclipse 之外的不同目录中尝试过它,并且没有任何结帐 可能混淆路径的svn repo。我尝试的另一件事是将 Writing.class 放入不同的包中,但没有帮助。

原问题:

我正在尝试在 Play 项目中将 SuperCSV 与 Dozer 一起使用。 官方的 supercsv 示例在单独的 Java 项目中运行良好。 但是当我将代码和所需的 SuperCSV Jars 放入一个新创建的 Play 项目中时,我总是 在这行代码中为 SurveyResponse.class 获取 ClassNotfoundException: beanWriter.configureBeanMapping(myPackage.csv.SurveyResponse.class, FIELD_MAPPING);

这是我的项目结构的屏幕截图: http://oi44.tinypic.com/mrqp7s.jpg

我确保所有 JARS 都可用,我将它们非托管放入 /lib 文件夹, 它们在 eclipse 中可用,并且在编译过程中不会出现错误。 我调试了代码,找到了 SurveyResponse.class 并且初始化了 beanWriter。 所以不知何故,Play 必须在后台做一些魔法来触发这个错误。 在后台播放什么可能会触发这种奇怪的行为? 我可以尝试做些什么来解决这个问题?

我对示例所做的更改使其适用于 Play: 我使用了与官方 supercsv 示例完全相同的代码。 我所做的唯一更改是删除 Writing.main(..) 方法并设置方法 Writing.writeWithDozerCsvBeanWriter() 和 Writing.partialWriteWithCsvDozerBeanWriter() 到 public,所以它可以从应用程序控制器访问。 当然我把所有类中的包名都改成了package myPackage.test;

示例链接: 在评论中看到,由于声誉低,我不能添加超过 2 个链接。

控制器:

public class Application extends Controller {
    public static Result index() throws Exception  {
        Writing.writeWithDozerCsvBeanWriter();
        Writing.partialWriteWithCsvDozerBeanWriter();
        return ok(index.render("Your new application is ready."));
    } 
}

在写作类中触发错误的代码:

ICsvDozerBeanWriter beanWriter = null;
    try {
        beanWriter = new CsvDozerBeanWriter(new FileWriter("target/writeWithCsvDozerBeanWriter.csv"),
            CsvPreference.STANDARD_PREFERENCE);
        
        // configure the mapping from the fields to the CSV columns
        //Here the exception occures:
        beanWriter.configureBeanMapping(myPackage.csv.SurveyResponse.class, FIELD_MAPPING);

堆栈跟踪:

play.api.Application$$anon$1: Execution exception[[MappingException: java.lang.ClassNotFoundException: myPackage.test.SurveyResponse]]
    at play.api.Application$class.handleError(Application.scala:289) ~[play_2.10.jar:2.1.1]
    at play.api.DefaultApplication.handleError(Application.scala:383) [play_2.10.jar:2.1.1]
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anon$2$$anonfun$handle$1.apply(PlayDefaultUpstreamHandler.scala:144) [play_2.10.jar:2.1.1]
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anon$2$$anonfun$handle$1.apply(PlayDefaultUpstreamHandler.scala:140) [play_2.10.jar:2.1.1]
    at play.api.libs.concurrent.PlayPromise$$anonfun$extend1$1.apply(Promise.scala:113) [play_2.10.jar:2.1.1]
    at play.api.libs.concurrent.PlayPromise$$anonfun$extend1$1.apply(Promise.scala:113) [play_2.10.jar:2.1.1]
    at play.api.libs.concurrent.PlayPromise$$anonfun$extend$1$$anonfun$apply$1.apply(Promise.scala:104) [play_2.10.jar:2.1.1]
    at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24) [scala-library.jar:na]
    at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24) [scala-library.jar:na]
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) [na:1.6.0_37]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [na:1.6.0_37]
    at java.lang.Thread.run(Unknown Source) [na:1.6.0_37]
org.dozer.MappingException: java.lang.ClassNotFoundException: myPackage.test.SurveyResponse
    at org.dozer.util.MappingUtils.throwMappingException(MappingUtils.java:82) ~[dozer-5.4.0.jar:na]
    at org.dozer.util.DefaultClassLoader.loadClass(DefaultClassLoader.java:38) ~[dozer-5.4.0.jar:na]
    at org.dozer.util.MappingUtils.loadClass(MappingUtils.java:224) ~[dozer-5.4.0.jar:na]
    at org.dozer.loader.DozerBuilder$MappingBuilder.classA(DozerBuilder.java:129) ~[dozer-5.4.0.jar:na]
    at org.dozer.loader.api.BeanMappingBuilder.mapping(BeanMappingBuilder.java:72) ~[dozer-5.4.0.jar:na]
    at org.dozer.loader.api.BeanMappingBuilder.mapping(BeanMappingBuilder.java:67) ~[dozer-5.4.0.jar:na]
    at org.supercsv.io.dozer.CsvDozerBeanWriter$MappingBuilder.configure(CsvDozerBeanWriter.java:178) ~[super-csv-dozer-2.1.0.jar:na]
    at org.dozer.loader.api.BeanMappingBuilder.build(BeanMappingBuilder.java:42) ~[dozer-5.4.0.jar:na]
    at org.dozer.DozerBeanMapper.addMapping(DozerBeanMapper.java:258) ~[dozer-5.4.0.jar:na]
    at org.supercsv.io.dozer.CsvDozerBeanWriter.configureBeanMapping(CsvDozerBeanWriter.java:91) ~[super-csv-dozer-2.1.0.jar:na]
    at myPackage.test.Writing.writeWithDozerCsvBeanWriter(Writing.java:88) ~[na:na]
    at controllers.Application.index(Application.java:12) ~[na:na]
    at Routes$$anonfun$routes$1$$anonfun$applyOrElse$1$$anonfun$apply$1.apply(routes_routing.scala:49) ~[na:na]
    at Routes$$anonfun$routes$1$$anonfun$applyOrElse$1$$anonfun$apply$1.apply(routes_routing.scala:49) ~[na:na]
    at play.core.Router$HandlerInvoker$$anon$6$$anon$2.invocation(Router.scala:164) ~[play_2.10.jar:2.1.1]
    at play.core.Router$Routes$$anon$1.invocation(Router.scala:345) ~[play_2.10.jar:2.1.1]
    at play.core.j.JavaAction$$anon$1.call(JavaAction.scala:31) ~[play_2.10.jar:2.1.1]
    at play.core.j.JavaAction$$anon$2.apply(JavaAction.scala:74) ~[play_2.10.jar:2.1.1]
    at play.core.j.JavaAction$$anon$2.apply(JavaAction.scala:73) ~[play_2.10.jar:2.1.1]
    at play.libs.F$Promise$PromiseActor.onReceive(F.java:420) ~[play_2.10.jar:2.1.1]
    at akka.actor.UntypedActor$$anonfun$receive$1.applyOrElse(UntypedActor.scala:159) ~[akka-actor_2.10.jar:na]
    at akka.actor.ActorCell.receiveMessage(ActorCell.scala:425) ~[akka-actor_2.10.jar:na]
    at akka.actor.ActorCell.invoke(ActorCell.scala:386) ~[akka-actor_2.10.jar:na]
    at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:230) ~[akka-actor_2.10.jar:na]
    at akka.dispatch.Mailbox.run(Mailbox.scala:212) ~[akka-actor_2.10.jar:na]
    at akka.dispatch.ForkJoinExecutorConfigurator$MailboxExecutionTask.exec(AbstractDispatcher.scala:502) ~[akka-actor_2.10.jar:na]
    at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:262) ~[scala-library.jar:na]
    at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:975) ~[scala-library.jar:na]
    at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1478) ~[scala-library.jar:na]
    at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:104) ~[scala-library.jar:na]
Caused by: java.lang.ClassNotFoundException: myPackage.test.SurveyResponse
    at java.net.URLClassLoader$1.run(Unknown Source) ~[na:1.6.0_37]
    at java.security.AccessController.doPrivileged(Native Method) ~[na:1.6.0_37]
    at java.net.URLClassLoader.findClass(Unknown Source) ~[na:1.6.0_37]
    at java.lang.ClassLoader.loadClass(Unknown Source) ~[na:1.6.0_37]
    at java.lang.ClassLoader.loadClass(Unknown Source) ~[na:1.6.0_37]
    at sbt.PlayCommands$$anonfun$53$$anonfun$55$$anon$2.loadClass(PlayCommands.scala:535) ~[na:na]
    at java.lang.Class.forName0(Native Method) ~[na:1.6.0_37]
    at java.lang.Class.forName(Unknown Source) ~[na:1.6.0_37]
    at org.apache.commons.lang3.ClassUtils.getClass(ClassUtils.java:823) ~[commons-lang3.jar:3.1]
    at org.apache.commons.lang3.ClassUtils.getClass(ClassUtils.java:889) ~[commons-lang3.jar:3.1]
    at org.apache.commons.lang3.ClassUtils.getClass(ClassUtils.java:872) ~[commons-lang3.jar:3.1]
    at org.dozer.util.DefaultClassLoader.loadClass(DefaultClassLoader.java:36) ~[dozer-5.4.0.jar:na]
    ... 28 common frames omitted

额外信息: 我仍然无法解决问题,但这里有一些额外的信息来缩小问题范围: 当我删除 configureBeanMapping 方法调用时,csv 标头已成功写入文件(请参见下面的代码)。 当我对填充的 SurveyResponse 对象执行 System.out.println() 时,SurveyResponse 类也在工作(参见下面的代码)。 所以这不是包名或类名的问题。

只写header的修改后的Code:

//...more code
myPackage.csv.SurveyResponse response3 = new myPackage.csv.SurveyResponse(42, false, Arrays.asList(new Answer(1, null), new Answer(2,
    "Carl Sagan"), new Answer(3, "Star Wars")));
final List<myPackage.csv.SurveyResponse> surveyResponses = Arrays.asList(response1, response2, response3);

ICsvDozerBeanWriter beanWriter = null;
try {
    beanWriter = new CsvDozerBeanWriter(new FileWriter("target/writeWithCsvDozerBeanWriter.csv"),
        CsvPreference.STANDARD_PREFERENCE);
    
    // configure the mapping from the fields to the CSV columns
    //beanWriter.configureBeanMapping(myPackage.csv.SurveyResponse.class, FIELD_MAPPING);
    
    //Prints the value 42 successfully
    System.out.println(response3.getAge());
    
    // write the header
    beanWriter.writeHeader("age", "consentGiven", "questionNo1", "answer1", "questionNo2", "answer2","questionNo3", "answer3");

//...more code

【问题讨论】:

标签: java jar playframework-2.0 dozer supercsv


【解决方案1】:

根据我从错误中了解到的情况,Play 正在尝试加载错误的类。看看这一行:

java.lang.ClassNotFoundException: org.supercsv.mock.dozer.SurveyResponse

我认为 SurverResponse 是您自己的项目类之一,而不是 SuperCSV 的一部分。尝试使用完整路径作为前缀,例如:

beanWriter.configureBeanMapping(whateverpackage.models.SurveyResponse.class, FIELD_MAPPING);

【讨论】:

  • 这是正确的包,所有示例类都在该包中。它是 org.supercsv.mock.dozer.Writing、org.supercsv.mock.dozer.SurveyResponse 和 org.supercsv.mock.dozer.Answer。在这里你可以看到带有包名的 SurveyResponse 类:supercsv.sourceforge.net/xref-test/org/supercsv/mock/dozer/…
  • 您确定这些示例甚至包含在生产/可下载的 jar 中吗?如果是这样的话,听起来很奇怪。
  • 不,我没有生产文件夹,我正在开发中。我所做的是将我下载的所有 jar (supercsv.sourceforge.net/downloading.html) 直接放入“pathToPlayProject/lib”文件夹中。并在包 org.supercsv.mock.dozer 中添加了树类 Answer、SurveyRespone 和 Writing。 lib 文件夹包含:commons-beanutils-1.8.3.jar、commons-lang3-3.1.jar、dozer-5.4.0.jar、jcl-over-slf4j-1.6.6.jar、slf4j-api-1.7.5 .jar, super-csv-2.1.0.jar, super-csv-dozer-2.1.0.jar 我想添加项目结构的图像,但我没有足够的信誉:-(
  • 我的意思是,您应该在其他地方添加 SurverResponse 类。你说,你自己加的。只需将其放在其他地方(即具有不同的包结构),然后再试一次。
  • 我试过了,不幸的是没有成功,同样的错误发生了。看看我写给“猎犬”的评论。
【解决方案2】:

SurveyResponseAnswersuper-csv-dozer 工件的 test 类 - 所以它们没有打包在发行版中(即它们不在 Maven 中或在 zip 文件中源锻造)。

您可以查看测试源 online 或签出 SVN repo(听起来您已经完成了),然后将它们复制到您的 Play 项目中。

这两个文件都在以下目录中:

supercsv/super-csv-dozer/src/test/java/org/supercsv/mock/dozer/

我有点好奇为什么在代码中尝试使用 SurveyResponse 时没有出现编译错误。我的猜测是您已签出 super-csv-dozer 项目并在您的 IDE 中打开,您的项目正在找到它。

【讨论】:

  • 感谢您的回复。这就是我已经做的,我复制了这两个类并自己创建了包结构“org.supercsv.mock.dozer”。现在我将其更改为“test.csv”。就像 i.am.michiel 建议的那样。但是我仍然遇到同样的错误:-(。这里的错误是:[MappingException: java.lang.ClassNotFoundException: test.csv.SurveyResponse] 我没有收到编译错误,因为我已经添加了 SurveyResponse 和 Answer。
猜你喜欢
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-07
  • 2013-06-07
相关资源
最近更新 更多