2013-09-06 3 views
2

Update:

Теперь я узнал что-то очень странное, это работает, когда я поставил скомпилированные классы тестов непосредственно в «supercsv -dozer-2.1.0.jar "с той же структурой, что и в svn repo. Но как только я использую свой собственный пакет, он не будет работать. Я всегда использовал весь путь вот так: myPackage.csv.SurveyResponse.class Что мне не хватает? и почему он работает в обычном Java-проекте, но не в Play Project? Я также пробовал его за пределами eclipse в другом каталоге и не имел никаких проверок от svn repo, которые могли бы путать пути. Еще одна вещь, которую я пробовал, - это положить Writing.class в другой пакет, но не помог.Официальный пример supercsv бульдозер не работает с Play - 2.1.1, Java

Оригинал qustion:

Im пытается использовать SuperCSV с Dozer в игровой проект. Официальный образец supercsv отлично работает в отдельном Java-проекте. Но когда я поставил код и необходимые SuperCSV Баночки в только что созданном Play проекта, я всегда получить ClassNotFoundException для SurveyResponse.class в этой строке кода: beanWriter.configureBeanMapping (myPackage.csv.SurveyResponse.class, FIELD_MAPPING);

Вот скриншот моей структуры проекта: http://oi44.tinypic.com/mrqp7s.jpg

Я убедился, что все БНК доступны, я поставил их неуправляемыми в Lib папки /, они доступны в затмении, и ошибки не отображаются во время компиляции , Я отлаживал код и найден SurveyResponse.class и инициализирован beanWriter. Итак, так или иначе игра должна сделать волшебство в фоновом режиме, чтобы вызвать эту ошибку. Что можно играть в фоновом режиме, чтобы вызвать такое нечетное поведение? Что я могу сделать, чтобы исправить это?

Изменения, внесенные в образец, поэтому он работает с Play: Я использовал точно такой же код, что и официальный пример supercsv. Единственное изменение, которое я сделал, это удалить метод Writing.main (..) и установить методы Writing.writeWithDozerCsvBeanWriter() и Writing.partialWriteWithCsvDozerBeanWriter() для публики, поэтому к нему можно получить доступ с контроллера приложения. И, конечно же, я изменил имя пакета во всех классах для упаковки myPackage.test;

Ссылки на образец: См. Комментарий, я не могу добавить более двух ссылок из-за низкой репутации.

Контроллер:

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

код, который вызывает ошибку в Writing классе:

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 

Дополнительная информация: Я до сих пор не смог решить эту проблему , но здесь некоторые дополнительные для сужения проблемы: Заголовок csv успешно записывается в файл, когда я удаляю вызов метода configureBeanMapping (см. код ниже). Класс SurveyResponse также работает, когда я делаю System.out.println() на заполненном объекте SurveyResponse (см. Код ниже). Так что это не проблема с именем пакета или класса.

modiefied Код, который пишет только заголовок:

//...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 
+0

Ссылки: http://supercsv.sourceforge.net/xref-test/org/supercsv/mock/dozer/package-summary.html http://supercsv.sourceforge.net/xref-test/org/ supercsv/example/Writing.html http://supercsv.sourceforge.net/examples_dozer.html –

+0

Мне никогда не приходилось это работать, я только что реализовал свой собственный создатель CSV. –

ответ

0

Из того, что я понял из ошибок, игра пытается загрузить неправильный класс. Посмотрите на этой линии:

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

Я думаю, что SurverResponse это один из ваших собственных классов проекта, а не часть SuperCSV. Попробуйте префикс полного путем, например:

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

- это правильный пакет, все образцы классов находятся внутри этого пакета. это org.supercsv.mock.dozer.Writing, org.supercsv.mock.dozer.SurveyResponse и org.supercsv.mock.dozer.Answer. здесь вы можете увидеть класс SurveyResponse с именем пакета: http://supercsv.sourceforge.net/xref-test/org/supercsv/mock/dozer/SurveyResponse.html –

+0

И вы уверены, что образцы включены даже в производство/загружаемый банку? Звучит странно, если это так. –

+0

Нет, у меня нет рабочей папки, im в разработке. то, что я сделал, помещают все загруженные jars (supercsv.sourceforge.net/downloading.html) непосредственно в папку «pathToPlayProject/lib». И добавил древовидные классы Ответ, SurveyRespone и Writing в пакете org.supercsv.mock.dozer. Папка 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 Я хотел добавить изображение структуры проекта, но у меня нет достаточного количества кредитов репутации :-( –

0

SurveyResponse и Answerявляются тестовыми классов super-csv-dozer артефакта - так они не упакованы в распределении (т.е. они не в Maven или zip-файл на SourceForge).

Вы можете просмотреть тестовый источник online или заказать SVN repo (как кажется, вы уже это сделали) и просто скопировать их в свой проект Play.

Оба файла находятся в следующем каталоге:

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

Я немного любопытно, почему вы не получаете ошибку компиляции при попытке использовать SurveyResponse в вашем коде. Я предполагаю, что проект super-csv-dozer проверен и открыт в вашей среде IDE, и ваш проект находит его.

+0

спасибо за ответ. Thats, что я уже сделал, я скопировал эти два класса и создал структуру пакета «org.supercsv.mock.dozer». изменил его на "test.csv". Как и в случае с i.am.michiel, но я все равно получаю ту же ошибку :-(Здесь ошибка: [MappingException: java.lang.ClassNotFoundExcept ion: test.csv.SurveyResponse] Я не получаю ошибки компиляции, потому что я уже добавляю SurveyResponse и Answer. –

Смежные вопросы