Code Monkey home page Code Monkey logo

play2-crud's Introduction

play2-crud

Join the chat at https://gitter.im/hakandilek/play2-crud

Powerful CRUD & DAO implementation with REST interface for play framework 2.x

For the Typesafe Activator check play2-crud-activator.

Some screenshots

  • index page crud-index page

  • create page create page

  • list page list page

Quick Start

Follow these steps to use play2-crud. You can also use it partially just for DAO or CRUD controllers. If you think any part needs further explanation, please report a new issue.

Add play2-crud dependency

You can begin with adding play2-crud dependency inside conf/Build.scala file.

  • Add app dependency:
    val appDependencies = Seq(
        javaCore, javaJdbc, javaEbean,
        "play2-crud" % "play2-crud_2.10" % "0.7.0"
    )

  • Dependency version is for version 0.7.0 defined, but you can use the latest version.

  • Add custom maven repositories:

    val main = play.Project(appName, appVersion, appDependencies).settings(
        //maven repository
        resolvers += "release repository" at  "http://hakandilek.github.com/maven-repo/releases/",
        resolvers += "snapshot repository" at "http://hakandilek.github.com/maven-repo/snapshots/"
    )

Associate Global settings

Direct reference

If you don't want to override the play application launcher, you just have to notice to play that the class to use as launcher is now GlobalCRUDSettings. Change the application.global configuration key in the conf/application.conf file, and use play.utils.crud.GlobalCRUDSettings:

...
application.global=play.utils.crud.GlobalCRUDSettings
...

Define routes

# CRUD Controllers
->     /app             play.crud.Routes

# REST API
->     /api             play.rest.Routes

Define model

  • Model class has to implement play.utils.dao.BasicModel with the type parameter indicating the type of the @Id field.
@Entity
public class Sample extends Model implements BasicModel<Long> {

   @Id
   private Long key;

   @Basic
   @Required
   private String name;

   public Long getKey() {
      return key;
   }

   public void setKey(Long key) {
      this.key = key;
   }

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }
}
  • Here the Sample model class implements BasicModel<Long> where key field indicated with @Id is Long.

... call http://localhost:9000/app and voila!

Samples

HOW-TO

Here you can find some HOW-TO documents introducing some powerful functionality:

play2-crud's People

Contributors

bryant1410 avatar dgmagno avatar eljaydub avatar gbersac avatar gitter-badger avatar hakandilek avatar necipk avatar pablo avatar pilou- avatar risenhoover avatar vendethiel avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

play2-crud's Issues

CRUDControllers in a module fail to render

From the bottom up:

m8 crashes, apparently confused where to look for sampleForm.scala.html. It exists in the app but play-crud perhaps is looking in twixt (since that's where the class that derived from CRUDController is.

java.lang.NoClassDefFoundError: views/html/SampleForm (wrong name: views/html/sa
mpleForm)
java.lang.NoClassDefFoundError: views/html/SampleForm (wrong name: views/html/sa
mpleForm)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:14
2)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:14
2)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:455)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:455)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:367)
at java.net.URLClassLoader$1.run(URLClassLoader.java:367)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at play.utils.crud.TemplateController.call(TemplateController.java:83)
at play.utils.crud.TemplateController.call(TemplateController.java:83)
at play.utils.dyn.DynamicCrudController.render(DynamicCrudController.jav
a:75)
at play.utils.dyn.DynamicCrudController.render(DynamicCrudController.jav
a:75)


NOTE. If I copy TwixtController up into the m8 app and derive SampleController from it, everything works fine.

Not working with 2.3

Play team moved template system to new project play.twirl.api.
So we need few changes:
import play.mvc.Content -> import play.twirl.api.Content
import play.api.templates.Html -> import play.twirl.api.Html

http://www.playframework.com/documentation/2.3.x/Migration23

Unfortunetly more need to be fixed. When I change imports, compiler crashes on the wrong number of parameters in Assets (return controllers.Assets.at(path, file);)

java.lang.NullPointerException when attempting to edit entity

I'm getting a NullPointerException when I attempt to edit a record. I believe this is due to the fact that my keys are UUIDs. I am able to successfully edit entities that use a Long as a Key, but all my other entities use UUIDs and get this error.

Here is where the error occurs:
public Result show(String key) {
Object k = this.keyConverter.convert(key);
return this.delegate.read(k);
}

I believe this.keyConverter == null;

Here is the stack trace:

Caused by: java.lang.NullPointerException: null
at play.utils.crud.ControllerProxy.show(ControllerProxy.java:30) ~[play2-crud_2.11-0.7.4-SNAPSHOT.jar:0.7.4-SNAPSHOT]
at play.utils.crud.RouterController.show(RouterController.java:76) ~[play2-crud_2.11-0.7.4-SNAPSHOT.jar:0.7.4-SNAPSHOT]
at play.crud.Routes$$anonfun$routes$1$$anonfun$applyOrElse$5$$anonfun$apply$39.apply(routes_routing.scala:174) ~[play2-crud_2.11-0.7.4-SNAPSHOT.jar:0.7.4-SNAPSHOT]
at play.crud.Routes$$anonfun$routes$1$$anonfun$applyOrElse$5$$anonfun$apply$39.apply(routes_routing.scala:174) ~[play2-crud_2.11-0.7.4-SNAPSHOT.jar:0.7.4-SNAPSHOT]
at play.core.Router$HandlerInvokerFactory$$anon$4.resultCall(Router.scala:264) ~[play_2.11-2.3.8.jar:2.3.8]

Custom pages

What are all the custom-pages names? I know of

{Model}List.scala.html
{Model}Form.scala.html

from the example but what are the others?

There is an error in samples

MatchError: java.lang.UnsupportedClassVersionError: play/utils/dao/BasicDAO : Unsupported major.minor version 51.0 (of class java.lang.UnsupportedClassVersionError)

DAOListeners

implement an listener interface following observer design pattern. Listeners will implement before_() and after_() operations for DAO C_UD (CRUD) operations.

Unresolved dependency error

I just downloaded the zip and ran it using -
activator run

Keep seeing the following error -
sbt.ResolveException: unresolved dependency: play2-crud#play2-crud_2.11;0.7.4-SNAPSHOT: not found

This is my build.sbt -
name := "play2-crud-activator"

version := "0.7.4-SNAPSHOT"

scalaVersion := "2.11.1"

libraryDependencies ++= Seq(
javaCore, javaJdbc, javaEbean,
"play2-crud" %% "play2-crud" % "0.7.4-SNAPSHOT",
"play2-crud" %% "play2-crud" % "0.7.4-SNAPSHOT" classifier "assets"
)

lazy val root = (project in file(".")).enablePlugins(PlayJava)

resolvers += "release repository" at "http://hakandilek.github.com/maven-repo/releases/"

resolvers += "snapshot repository" at "http://hakandilek.github.com/maven-repo/snapshots/"

Very new to this so please help.

Can not get play2-crud working with Play 2.5.1 + Scala 2.11.7

Thanks a lot for such a nice template for CRUD operations play2_crud. It worked fine with the activator. But when I am trying to integrate with the latest version of play (2.5.4) and scala (2.11.7) and I am facing a problem.

I get the following error.

[info] Resolving play2-crud#play2-crud_2.11;0.7.4-SNAPSHOT ...
[warn] Unable to reparse play2-crud#play2-crud_2.11;0.7.4-SNAPSHOT from snapshot repository, using Fri Oct 23 01:36:15 IST 2015
[warn] Choosing snapshot repository for play2-crud#play2-crud_2.11;0.7.4-SNAPSHOT

My build.sbt looks like this

name := """my-second-app"""

version := "1.0-SNAPSHOT"

lazy val root = (project in file(".")).enablePlugins(PlayJava,PlayEbean)

scalaVersion := "2.11.7"

libraryDependencies ++= Seq(
  javaJdbc,
  cache,
  javaWs, javaJdbc,
  "play2-crud" %% "play2-crud" % "0.7.4-SNAPSHOT",
  "play2-crud" %% "play2-crud" % "0.7.4-SNAPSHOT" classifier "assets"
)

resolvers += "release repository" at  "http://hakandilek.github.com/maven-repo/releases/"

resolvers += "snapshot repository" at "http://hakandilek.github.com/maven-repo/snapshots/"

Can you please suggest how can I fix this. Thanks for your help.

Play 2.1 sample

Change sample and HOW-TO according to play 2.1 dependency injection

NoSuchMethodError play/templates/TemplateMagic$RichString - Play 2.2.2 and plugin 0.7.2-SNAPSHOT

Hi there,

Upgraded to Play 2.2.2 after seeing support go in for this plugin :-). Unfortunately I have the following error though:

ERROR] [03/07/2014 16:47:14.512] [play-akka.actor.default-dispatcher-9] [ActorSystem(play)] Uncaught error from thread [play-akka.actor.default-dispatcher-9] shutting down JVM since 'akka.jvm-exit-on-fatal-error' is enabled
java.lang.NoSuchMethodError: play.templates.TemplateMagic$.richString(Ljava/lang/String;)Lplay/templates/TemplateMagic$RichString;
at play.utils.crud.views.html.template.menu$$anonfun$apply$2.apply(menu.template.scala:46)
at play.utils.crud.views.html.template.menu$$anonfun$apply$2.apply(menu.template.scala:45)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
at scala.collection.Iterator$class.foreach(Iterator.scala:727)
at scala.collection.AbstractIterator.foreach(Iterator.scala:1157)
at scala.collection.IterableLike$class.foreach(IterableLike.scala:72)
at scala.collection.AbstractIterable.foreach(Iterable.scala:54)
at scala.collection.TraversableLike$class.map(TraversableLike.scala:244)
at scala.collection.AbstractTraversable.map(Traversable.scala:105)
at play.utils.crud.views.html.template.menu$.apply(menu.template.scala:45)
at play.utils.crud.views.html.template.layout$.apply(layout.template.scala:50)
at play.utils.crud.views.html.index$.apply(index.template.scala:33)
at play.utils.crud.views.html.index$.render(index.template.scala:61)
at play.utils.crud.views.html.index.render(index.template.scala)
at play.utils.crud.RouterCrudController.index(RouterCrudController.java:68)
at play.crud.Routes$$anonfun$routes$1$$anonfun$applyOrElse$1$$anonfun$apply$1.apply(routes_routing.scala:77)
at play.crud.Routes$$anonfun$routes$1$$anonfun$applyOrElse$1$$anonfun$apply$1.apply(routes_routing.scala:77)
at play.core.Router$HandlerInvoker$$anon$7$$anon$2.invocation(Router.scala:183)
at play.core.Router$Routes$$anon$1.invocation(Router.scala:377)
at play.core.j.JavaAction$$anon$1.call(JavaAction.scala:56)
at play.GlobalSettings$1.call(GlobalSettings.java:64)
at play.core.j.JavaAction$$anon$3.apply(JavaAction.scala:91)
at play.core.j.JavaAction$$anon$3.apply(JavaAction.scala:90)
at play.core.j.FPromiseHelper$$anonfun$flatMap$1.apply(FPromiseHelper.scala:82)
at play.core.j.FPromiseHelper$$anonfun$flatMap$1.apply(FPromiseHelper.scala:82)
at scala.concurrent.Future$$anonfun$flatMap$1.apply(Future.scala:251)
at scala.concurrent.Future$$anonfun$flatMap$1.apply(Future.scala:249)
at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32)
at play.core.j.HttpExecutionContext$$anon$2.run(HttpExecutionContext.scala:37)
at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:42)
at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:386)
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
at play.core.j.JavaAction$$anon$3.apply(JavaAction.scala:90)

at play.core.j.FPromiseHelper$$anonfun$flatMap$1.apply(FPromiseHelper.scala:82)
at play.core.j.FPromiseHelper$$anonfun$flatMap$1.apply(FPromiseHelper.scala:82)
at scala.concurrent.Future$$anonfun$flatMap$1.apply(Future.scala:251)
at scala.concurrent.Future$$anonfun$flatMap$1.apply(Future.scala:249)
at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32)
at play.core.j.HttpExecutionContext$$anon$2.run(HttpExecutionContext.scala:37)
at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:42)
at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:386)
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)

CachedDAO problem

Hi,

I'm trying to run the sample, and I'm running into this compile-time error:

! @6eaa0p04e - Internal server error, for (GET) [/] ->

sbt.PlayExceptions$CompilationException: Compilation error[error: package play.utils.cache does not exist]
at sbt.PlayReloader$$anon$2$$anonfun$reload$2$$anonfun$apply$15$$anonfun$apply$16.apply(PlayReloader.scala:349) ~[na:na]
at sbt.PlayReloader$$anon$2$$anonfun$reload$2$$anonfun$apply$15$$anonfun$apply$16.apply(PlayReloader.scala:349) ~[na:na]
at scala.Option.map(Option.scala:133) ~[scala-library.jar:na]
at sbt.PlayReloader$$anon$2$$anonfun$reload$2$$anonfun$apply$15.apply(PlayReloader.scala:349) ~[na:na]
at sbt.PlayReloader$$anon$2$$anonfun$reload$2$$anonfun$apply$15.apply(PlayReloader.scala:346) ~[na:na]
at scala.Option.map(Option.scala:133) ~[scala-library.jar:na]

Update

After doing the steps on the first instruction page, should I be able to update things in a database, or do I have to implement something else as well? I can see all of the data in the database, but when I try to update something I get this error:

[NullPointerException: null]

Guice warning while extending CRUDController

I am creating an intermediate class between CRUDController and my controllers. That said all my controllers extend MyCrudController which extend CRUDController :

public abstract class MyCrudController<K, M extends BasicModel<K>> extends CRUDController<K, M>
{
    public MyCrudController(DAO<K, M> dao, Class<K> keyClass, Class<M> modelClass)
    {
        super(dao, Form.form(modelClass), keyClass,
                modelClass, 10, "id" + modelClass.getSimpleName());
        className = modelClass.getSimpleName();
        Logger.debug("className: " + className);
    }
}

Extended by :

public class UserCtr extends MyCrudController<Long, User>
{
    @Inject
    public UserCtr(models.UserDao dao)
    {
        super(dao, Long.class, User.class);
    }
}

Everythings work fine, except that I get the following error every time I restart the interface :

Note that the @Inject in the UserCtr must be present, otherwise, the application doesn't acknowledge the existence of UserCtr. Adding @Inject to the constructor of MyCrudController or UserDAO doesn't change anything

com.google.inject.ConfigurationException: Guice configuration errors:

1) No implementation for crud.MyCrudController was bound.
  while locating crud.MyCrudController

1 error
    at com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:1004)
    at com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:961)
    at com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1013)
    at play.utils.inject.InjectAdapter.getInstance(InjectAdapter.java:34)
    at play.utils.crud.CRUDManager.getController(CRUDManager.java:59)
    at play.utils.crud.GlobalCRUDSettings.getControllerInstance(GlobalCRUDSettings.java:12)
    at play.utils.meta.cp.ClasspathScanningControllerRegistry.scanCrud(ClasspathScanningControllerRegistry.java:151)
    at play.utils.meta.cp.ClasspathScanningControllerRegistry.<init>(ClasspathScanningControllerRegistry.java:46)
    at play.utils.crud.CRUDManager.initialize(CRUDManager.java:45)
    at play.utils.crud.GlobalCRUDSettings.onStart(GlobalCRUDSettings.java:23)
    at play.core.j.JavaGlobalSettingsAdapter.onStart(JavaGlobalSettingsAdapter.scala:18)
    at play.api.GlobalPlugin.onStart(GlobalSettings.scala:203)
    at play.api.Play$$anonfun$start$1$$anonfun$apply$mcV$sp$1.apply(Play.scala:88)
    at play.api.Play$$anonfun$start$1$$anonfun$apply$mcV$sp$1.apply(Play.scala:88)
    at scala.collection.immutable.List.foreach(List.scala:318)
    at play.api.Play$$anonfun$start$1.apply$mcV$sp(Play.scala:88)
    at play.api.Play$$anonfun$start$1.apply(Play.scala:88)
    at play.api.Play$$anonfun$start$1.apply(Play.scala:88)
    at play.utils.Threads$.withContextClassLoader(Threads.scala:18)
    at play.api.Play$.start(Play.scala:87)
    at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(ApplicationProvider.scala:139)
    at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(ApplicationProvider.scala:112)
    at scala.Option.map(Option.scala:145)
    at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1.apply(ApplicationProvider.scala:112)
    at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1.apply(ApplicationProvider.scala:110)
    at scala.util.Success.flatMap(Try.scala:200)
    at play.core.ReloadableApplication$$anonfun$get$1.apply(ApplicationProvider.scala:110)
    at play.core.ReloadableApplication$$anonfun$get$1.apply(ApplicationProvider.scala:102)
    at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24)
    at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24)
    at scala.concurrent.forkjoin.ForkJoinTask$AdaptedRunnableAction.exec(ForkJoinTask.java:1361)
    at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
    at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
    at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
    at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
[info] play - Application started (Dev)

I haven't understand a word of what is Guice, but the problem has something to do with it.
Thanks for help.

Simple CRUD use case failure to map routes

Using Play 2.1.1, have followed the 'simple' instructions but get the following error when loading the application.

betterrev crud

Also, attempting to go directly to the /app URL gives an NPE:

play.api.Application$$anon$1: Execution exception[[NullPointerException: null]]
at play.api.Application$class.handleError(Application.scala:287) ~[play_2.10-2.1.5.jar:2.1.5]
at play.api.DefaultApplication.handleError(Application.scala:381) [play_2.10-2.1.5.jar:2.1.5]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$play$core$server$netty$PlayDefaultUpstreamHandler$$handle$1$1.apply(PlayDefaultUpstreamHandler.scala:143) [play_2.10-2.1.5.jar:2.1.5]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$play$core$server$netty$PlayDefaultUpstreamHandler$$handle$1$1.apply(PlayDefaultUpstreamHandler.scala:139) [play_2.10-2.1.5.jar:2.1.5]
at play.api.libs.concurrent.PlayPromise$$anonfun$extend1$1.apply(Promise.scala:113) [play_2.10-2.1.5.jar:2.1.5]
at play.api.libs.concurrent.PlayPromise$$anonfun$extend1$1.apply(Promise.scala:113) [play_2.10-2.1.5.jar:2.1.5]
java.lang.NullPointerException: null
at play.utils.crud.GlobalCRUDSettings.getControllerInstance(GlobalCRUDSettings.java:12) ~[play2-crud_2.10-0.7.0.jar:0.7.0]
at play.core.j.JavaGlobalSettingsAdapter.getControllerInstance(JavaGlobalSettingsAdapter.scala:45) ~[play_2.10-2.1.5.jar:2.1.5]
at play.crud.Routes$$anonfun$routes$1$$anonfun$applyOrElse$1$$anonfun$apply$1.apply(routes_routing.scala:73) ~[play2-crud_2.10-0.7.0.jar:0.7.0]
at play.crud.Routes$$anonfun$routes$1$$anonfun$applyOrElse$1$$anonfun$apply$1.apply(routes_routing.scala:73) ~[play2-crud_2.10-0.7.0.jar:0.7.0]
at play.core.Router$HandlerInvoker$$anon$6$$anon$2.invocation(Router.scala:193) ~[play_2.10-2.1.5.jar:2.1.5]
at play.core.Router$Routes$$anon$1.invocation(Router.scala:373) ~[play_2.10-2.1.5.jar:2.1.5]

generate a select tag?

I am not sure how to generate a select tag.i can see the code in Complex model but i don't see any select field.Can you help me figure out how to use it.
static enum Select {
@EnumValue("1")
OPTION1,

    @EnumValue("2")
    OPTION2,

    @EnumValue("3")
    OPTION3,
          ;

}
Now how should i define another field that uses values from this enum?

OptimisticLockException when updating an entity

Hi there,

This is from using the samples (except I've changed the entity name from Sampel to Tag). After updating an existing Tag entity, I get the following exception (I'm using the in-memory datastore that comes with Play):

play.api.Application$$anon$1: Execution exception[[OptimisticLockException: Data has changed. updated [0] rows sql[update tag set name=? where id=?] bind[null]]]
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]
javax.persistence.OptimisticLockException: Data has changed. updated [0] rows sql[update tag set name=? where id=?] bind[null]
at com.avaje.ebeaninternal.server.persist.dml.DmlHandler.checkRowCount(DmlHandler.java:103) ~[avaje-ebeanorm-server.jar:na]
at com.avaje.ebeaninternal.server.persist.dml.UpdateHandler.execute(UpdateHandler.java:88) ~[avaje-ebeanorm-server.jar:na]
at com.avaje.ebeaninternal.server.persist.dml.DmlBeanPersister.execute(DmlBeanPersister.java:86) ~[avaje-ebeanorm-server.jar:na]
at com.avaje.ebeaninternal.server.persist.dml.DmlBeanPersister.update(DmlBeanPersister.java:66) ~[avaje-ebeanorm-server.jar:na]
at com.avaje.ebeaninternal.server.persist.DefaultPersistExecute.executeUpdateBean(DefaultPersistExecute.java:91) ~[avaje-ebeanorm-server.jar:na]
at com.avaje.ebeaninternal.server.core.PersistRequestBean.executeNow(PersistRequestBean.java:485) ~[avaje-ebeanorm-server.jar:na]

NumberFormatException when parsing a Model

! @6gaakbed0 - Internal server error, for (GET) [/app/Interest/Action(parser=BodyParser(anyContent))] ->

play.api.Application$$anon$1: Execution exception[[NumberFormatException: For input string: "Action(parser=BodyParser(anyContent))"]]
at play.api.Application$class.handleError(Application.scala:287) ~[play_2.10-2.1.5.jar:2.1.5]
at play.api.DefaultApplication.handleError(Application.scala:381) [play_2.10-2.1.5.jar:2.1.5]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$play$core$server$netty$PlayDefaultUpstreamHandler$$handle$1$1.apply(PlayDefaultUpstreamHandler.scala:143) [play_2.10-2.1.5.jar:2.1.5]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$play$core$server$netty$PlayDefaultUpstreamHandler$$handle$1$1.apply(PlayDefaultUpstreamHandler.scala:139) [play_2.10-2.1.5.jar:2.1.5]
at play.api.libs.concurrent.PlayPromise$$anonfun$extend1$1.apply(Promise.scala:113) [play_2.10-2.1.5.jar:2.1.5]
at play.api.libs.concurrent.PlayPromise$$anonfun$extend1$1.apply(Promise.scala:113) [play_2.10-2.1.5.jar:2.1.5]
java.lang.NumberFormatException: For input string: "Action(parser=BodyParser(anyContent))"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) ~[na:1.7.0_45]
at java.lang.Long.parseLong(Long.java:441) ~[na:1.7.0_45]
at java.lang.Long.valueOf(Long.java:540) ~[na:1.7.0_45]
at play.utils.meta.convert.LongConverter.convert(LongConverter.java:12) ~[play2-crud_2.10-0.7.2-SNAPSHOT.jar:0.7.2-SNAPSHOT]
at play.utils.meta.convert.LongConverter.convert(LongConverter.java:4) ~[play2-crud_2.10-0.7.2-SNAPSHOT.jar:0.7.2-SNAPSHOT]
at play.utils.crud.ControllerProxy.show(ControllerProxy.java:30) ~[play2-crud_2.10-0.7.2-SNAPSHOT.jar:0.7.2-SNAPSHOT]
[debug] p.u.c.RouterController - show <- Interest, Action(parser=BodyParser(anyContent))
[debug] p.u.m.c.ClasspathScanningControllerRegistry - getCrudController <- key: class java.lang.Long model: class models.Interest
[debug] p.u.m.c.ClasspathScanningControllerRegistry - controller : null

Project status?

I would like to use this project with Play 2.3.x, but it this project maintained at all now?

How to get the lastest version in my build.sbt?

Wrong Parameter type for the editForm method

Issue description

When I call to the address : http://localhost:9000/app/User/3/edit
I get an error about wrong parameter type for method execution.
The exeception has been send from the line 97 of TemplateController.java (in the call method) :

result = ReflectionUtils.invokeMethod(method, null, paramValues);

Hypothesis

This is probably a problem of cast of the string in the url to the generic type K of the CRUDController. RouterController.editForm(String name, String key) is call in the route and its argument key is cast implicitly to the type K while relay to ControllerProxyCRUD.editForm(key).
This is not throwing any exception at this moment, but it seems like a lack of correct cast come to fame while used in the TemplateController.call function.

The strange thing is that, if I type the url http://localhost:9000/app/User/3/delete, the deletion work fine while the same cast procedure (ie: no procedure) is processed.

Workaround

!!!Warning: ugly code!!!

I have a class User which inherit a class MyCrudController<Long, User> which extend CRUDController<Long, User>.
The idea is to render the form independently of the crudPlay plugin, so that I can have my own cast engine (which is very ugly):

new Long(key.toString())

This few words solve the entire problem !

User.java

public class UserCtr extends MyCrudController<Long, User>
{
    @Inject
    public UserCtr(models.User.Dao dao)
    {
        super(dao, Long.class, User.class);
    }

    private static CrudForm<User> form = null;

    public static FormOptions<User> getFormOptions(Long _id, Form<User> _form)
    {
        if (form == null)
        {
            form = new CrudForm<User>(User.class, "UserCtr.createTitle", "UserCtr.createTitle");
        }
        User logUser = Login.getLogUser();
        return form.getOptions(_id, logUser, _form);
    }
        [...]
}

MyCrudController.java

/**
 * The K generic type must be of type Long.
 * Stating it statically in the definition of the class (ie: extends CRUDController<Long, M>)
 * is throwing exception.
 */
@With(misc.LoginAction.class)
public abstract class MyCrudController<K, M extends BasicModel<K>> extends CRUDController<K, M>
{
        //This fields are private in the CRUDController, so I redefine them
    protected String        className;
    protected Class<M>      myModelClass;
    protected Class<K>      myKeyClass;
    private final DAO<K, M> myDao;

    @Inject
    public MyCrudController(DAO<K, M> dao, Class<K> keyClass, Class<M> modelClass)
    {
        super(dao, Form.form(modelClass), keyClass,
                modelClass, 10, "id" + modelClass.getSimpleName());
        className = modelClass.getSimpleName();
        myModelClass = modelClass;
        myKeyClass = keyClass;
        myDao = dao;
    }

    @Override
    protected Call                  toIndex()
    {
        return controllers.routes.Application.index();
    }

    @Override
    public Result                   editForm(K key)
    {
        Form<M> sendForm = Form.form(myModelClass);
        M toUpdate = myDao.get(key);
        if (toUpdate == null){
            String msg = "Can't found with id : " + key;
            play.Logger.error(msg);
            ListInfo.addMessage(msg, ListInfo.InfoType.ERROR);
            return ok(msg);
        }
        sendForm = sendForm.fill(toUpdate);
        //      return super.editForm(key);
        return formRenderMethod(key, sendForm);
    }

    /**
     * Function which render and return the form independently of the crudPlay
     * plugin.
     * @return
     */
    private Result                  formRenderMethod(K key, Form<M> form)
    {
        Method      method;

        try{
            Class<?> template = Class.forName("views.html." + templateForForm());
            method = template.getMethod("render", myKeyClass, Form.class);
            Logger.debug("key: " + key.toString());
                        //here is the magic cast !
            return ok((Content) method.invoke(template, new Long(key.toString()), form));
        }catch(Throwable e){
            Logger.error(e.getMessage());
        }
        return null;
    }

    protected String                templateForForm()
    {
        return className.toLowerCase() + "Form";
    }
        [...]
}

And this is de dao. I don't know what is the utility of that class, but I know it is involved in the process of getting a Model instance out of a key. In case it is helpful.

public class User extends Model implements BasicModel<Long>
{
        [...]

    public static class Dao extends BasicDAO<Long, User> {
        @Inject
        public Dao() {
            super(Long.class, User.class);
        }
    }
}

Adding play2-crud to dependencies caused "Conflicting cross-version" error

I am trying to add play2-crud to my project. However, I am getting "(*:update) Conflicting cross-version suffixes in: org.scala-stm:scala-stm" error.

I am using Play 2.2.1. Below is my build.sbt content:

name := "myApp"

version := "1.0-SNAPSHOT"

libraryDependencies ++= Seq(
  javaJdbc,
  javaEbean,
  cache 
)

libraryDependencies +=  "play2-crud" % "play2-crud_2.10" % "0.7.0"       

resolvers += "release repository" at  "http://hakandilek.github.com/maven-repo/releases/"

resolvers += "snapshot repository" at "http://hakandilek.github.com/maven-repo/snapshots/"

play.Project.playJavaSettings

ebeanEnabled := true

compile in Test <<= PostCompile(Test)

And I added

"resolvers += "njin github repository (snapshots)" at "http://njin-fr.github.com/repository/snapshots"" 

to my plugin.sbt.

Is this a known issue? I googled the whole day with no result.

Guice configuration errors: Could not find suitable constructor in controllers

I am trying to define a custom REST controller as per custom-rest-controllers.md. It compiles and runs the list method correctly, but then it gets an exception, seemingly to do with dynamic controller routes, although the routes are not defined with '@'. Here is the error and stack trace:

com.google.inject.ConfigurationException: Guice configuration errors:

  1. Could not find a suitable constructor in controllers.LinkRestController. Clas
    ses must have either one (and only one) constructor annotated with @Inject or a
    zero-argument constructor that is not private.
    at controllers.LinkRestController.class(LinkRestController.java:21)
    while locating controllers.LinkRestController

1 error
at com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java
:1004)
at com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java
:961)
at com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java
:1013)
at play.utils.inject.InjectAdapter.getInstance(InjectAdapter.java:34)
at play.utils.crud.CRUDManager.getController(CRUDManager.java:59)
at play.utils.crud.GlobalCRUDSettings.getControllerInstance(GlobalCRUDSe
ttings.java:12)
at play.utils.meta.cp.ClasspathScanningControllerRegistry.scanRest(Class
pathScanningControllerRegistry.java:116)
at play.utils.meta.cp.ClasspathScanningControllerRegistry.(Classpa
thScanningControllerRegistry.java:45)
at play.utils.crud.CRUDManager.initialize(CRUDManager.java:45)
at play.utils.crud.GlobalCRUDSettings.onStart(GlobalCRUDSettings.java:23
)
at play.core.j.JavaGlobalSettingsAdapter.onStart(JavaGlobalSettingsAdapt
er.scala:18)
at play.api.GlobalPlugin.onStart(GlobalSettings.scala:203)
at play.api.Play$$anonfun$start$1$$anonfun$apply$mcV$sp$1.apply(Play.sca
la:88)
at play.api.Play$$anonfun$start$1$$anonfun$apply$mcV$sp$1.apply(Play.sca
la:88)
at scala.collection.immutable.List.foreach(List.scala:318)
at play.api.Play$$anonfun$start$1.apply$mcV$sp(Play.scala:88)
at play.api.Play$$anonfun$start$1.apply(Play.scala:88)
at play.api.Play$$anonfun$start$1.apply(Play.scala:88)
at play.utils.Threads$.withContextClassLoader(Threads.scala:18)
at play.api.Play$.start(Play.scala:87)
at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1$$anon
fun$1.apply(ApplicationProvider.scala:139)
at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1$$anon
fun$1.apply(ApplicationProvider.scala:112)
at scala.Option.map(Option.scala:145)
at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1.apply
(ApplicationProvider.scala:112)
at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1.apply
(ApplicationProvider.scala:110)
at scala.util.Success.flatMap(Try.scala:200)
at play.core.ReloadableApplication$$anonfun$get$1.apply(ApplicationProvi
der.scala:110)
at play.core.ReloadableApplication$$anonfun$get$1.apply(ApplicationProvi
der.scala:102)
at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(
Future.scala:24)
at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.sca
la:24)
at scala.concurrent.forkjoin.ForkJoinTask$AdaptedRunnableAction.exec(For
kJoinTask.java:1361)
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool
.java:1339)
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:19
79)
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThre
ad.java:107)
[info] play - Application started (Dev)

GlobalCRUDSettings onStart is not working

Hi,

I had a GlobalSettings class which worked fine when I began my project. I then moved to play2-crud and it is not working anymore.

My Global class is in the app/ folder. My code :

import play.Logger;
import play.utils.crud.GlobalCRUDSettings;

public class Global extends GlobalCRUDSettings {

    @Override
    public void onStart(Application app) {
        super.onStart(app);
        Logger.debug("###app begin");
    }
}

When I relaunch the application, type the command run and refresh my page, the log comment is not appearing. If I test it in the sample crud activator application, the same problem.
Why ?

Multiple database servers support

In my application I have mulpitle database ebean servers:
ebean.central="models.central."
ebean.local="models.local.
"

As I understand, there is no support for multiple servers:
public BasicDAO(Class keyClass, Class modelClass) {
this(new Finder<K, M>(keyClass, modelClass));
}

In this code there is no serverName parameter in the Finder constructor call.

What can I do in this situation ?
Do you plan to add this feature in the future ?

List returns NPE

Hi there,

Just trying out your app, most things work well but whenever I try to display a list I get an NPE:

play.api.Application$$anon$1: Execution exception[[NullPointerException: null]]
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]
java.lang.NullPointerException: null
at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:191) ~[spring-core.jar:3.1.2.RELEASE]
at play.utils.crud.DynamicTemplateController.call(DynamicTemplateController.java:68) ~[play2-crud_2.10-0.4.0-SNAPSHOT.jar:0.4.0-SNAPSHOT]
at play.utils.crud.DynamicTemplateController.ok(DynamicTemplateController.java:21) ~[play2-crud_2.10-0.4.0-SNAPSHOT.jar:0.4.0-SNAPSHOT]
at play.utils.crud.CRUDController.list(CRUDController.java:46) ~[play2-crud_2.10-0.4.0-SNAPSHOT.jar:0.4.0-SNAPSHOT]
at controllers.Application.tagList(Application.java:39) ~[na:na]
at Routes$$anonfun$routes$1$$anonfun$applyOrElse$7$$anonfun$apply$7.apply(routes_routing.scala:141) ~[na:na]

value RouterCrudController is not a member

Hi there,
I'm trying out play2-crud. So far I've run the examples in /samples/ and no problem, they work fine. However, when I compile the project in /project-code/ I get the following errors:

[info] Compiling 17 Scala sources and 58 Java sources to /Users/jaro/play/play2-crud/project-code/target/scala-2.10/classes...
[error] /Users/jaro/play/play2-crud/project-code/app/play/utils/crud/views/edit.scala.html:13: value RouterCrudController is not a member of object play.utils.crud.routes
[error] @Form(if(key != null) { play.utils.crud.routes.RouterCrudController.update(model.getName, key + "") }
[error] ^
[error] /Users/jaro/play/play2-crud/project-code/app/play/utils/crud/views/index.scala.html:23: value RouterCrudController is not a member of object play.utils.crud.routes
[error] @Messages(item)
[error] ^
[error] /Users/jaro/play/play2-crud/project-code/app/play/utils/crud/views/list.scala.html:16: value RouterCrudController is not a member of object play.utils.crud.routes
[error]

@Messages("crud.createNew")


[error] ^
[error] /Users/jaro/play/play2-crud/project-code/app/play/utils/crud/views/template/layout.scala.html:13: value Assets is not a member of object play.utils.crud.routes
[error]
[error] ^
[error] /Users/jaro/play/play2-crud/project-code/app/play/utils/crud/views/template/menu.scala.html:14: value RouterCrudController is not a member of object play.utils.crud.routes
[error] @Utils.appName
[error] ^
[error] 5 errors found
error Compilation failed

I come from Java and am quite new in Play. I think I'm missing something in my configuration to make it work. Would you spread some light? Thanks

I'm using: play 2.2.2 built with Scala 2.10.3, JDK 7
Cheers

SimpleForm Exception

When trying to create your own SimpleForm, when using the edit function you will get an [IllegalArgumentException: argument type mismatch] error. The new object function works.

The error-log

! @6i79kh26i - Internal server error, for (GET) [/app/Voeding/1/edit] ->
play.api.Application$$anon$1: Execution exception[[IllegalArgumentException: argument type mismatch]]
at play.api.Application$class.handleError(Application.scala:293) ~[na:na]
at play.api.DefaultApplication.handleError(Application.scala:399) [na:na]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$2$$anonfun$applyOrElse$3.apply(PlayDefaultUpstreamHandler.scala:261) [na:na]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$2$$anonfun$applyOrElse$3.apply(PlayDefaultUpstreamHandler.scala:261) [na:na]
at scala.Option.map(Option.scala:145) [na:na]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$2.applyOrElse(PlayDefaultUpstreamHandler.scala:261) [na:na]
Caused by: java.lang.IllegalArgumentException: argument type mismatch
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_05]
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_05]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_05]
at java.lang.reflect.Method.invoke(Unknown Source) ~[na:1.8.0_05]
at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:191) ~[na:na]
at play.utils.crud.TemplateController.call(TemplateController.java:97) ~[na:na] 

NumberFormatException: null when using the create REST API controller

Should I be able to use the REST API to create a new Simple object without specifying the ID for the new Simple object created?

Running a command like this using the current source produces a NumberFormatException when trying to convert a non-existent id field of type Long from null:

$ curl -X POST -H "Content-type: application/json" -d '{"name": "new simple object"}' http://localhost:9000/api/Simple/create

Am I just missing something?

Play run/eclipse not working

Not able to run your app, its throwing error while compiling. I am typing below command.
C:\play-2.2.0\play2-crud-master\project-code>play run

Problem run-time with Java 6

After compiled when I call http://localhost:9000 is showed this error: play/utils/crud/GlobalCRUDSettings : Unsupported major.minor version 51.0
I tried to add this row in build.sbt:

javacOptions ++= Seq("-source", "1.6", "-target", "1.6")

but it didn't work. How can I solve this problem?
Thanks in advance.

Hide DAO Finders

make DAO.find() methods protected in order to prevent Controller access.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.