Play Framework: bindovani entit ve formulari rubrika: Programování: Java
1
martin1
položil/-a 18.10.2016
Muzete mi prosim poradit, jak v Play Frameworku nabindovat dve entity?
Entity:
@Entity @Table(name = "user") public class User { @Id @GeneratedValue(strategy= GenerationType.IDENTITY) private Integer id; private String name; @ManyToOne private Address address; // get/set } @Entity @Table(name = "address") public class Address { @Id @GeneratedValue(strategy= GenerationType.IDENTITY) private Integer id; private String country; @OneToMany(mappedBy = "address") private List<User> users; // get/set }
View:
@(users: List[User], addresses: List[Address]) @main() { <form action="@routes.HomeController.addUser()" method="post"> <input type="text" name="name" /> <select name="address"> @for(address <- addresses) { <option value="@address.getId"> @address.getCountry </option> } </select> <button>Add User</button> </form> <form action="@routes.HomeController.addAddress()" method="post"> <input type="text" name="country" /> <button>Add Address</button> </form> }
Controller:
public class HomeController extends Controller { @Inject private UserDao userDao; @Inject private AddressDao addressDao; // ... @Transactional public Result addUser() { User user = Form.form(User.class).bindFromRequest().get(); userDao.save(user); return redirect(routes.HomeController.index()); } @Transactional public Result addAddress() { Address address = Form.form(Address.class).bindFromRequest().get(); addressDao.save(address); return redirect(routes.HomeController.index()); } }
Ve Springu pouzivam WebDataBinder
. V UserController
a funguje to:
@InitBinder public void initBinder(WebDataBinder binder) { binder.registerCustomEditor(Address.class, "address", new PropertyEditorSupport() { @Override public void setAsText(String text) { int id = Integer.parseInt(text); Address address = addressManager.findById(id); setValue(address); } }); });
Chyba pri pridani uzivatele:
[info] play.api.Play - Application started (Dev) [error] application - ! @71me9manp - Internal server error, for (POST) [/user] -> play.api.http.HttpErrorHandlerExceptions$$anon$1: Execution exception[[CompletionException: java.lang.NullPointerException]] at play.api.http.HttpErrorHandlerExceptions$.throwableToUsefulException(HttpErrorHandler.scala:280) at play.api.http.DefaultHttpErrorHandler.onServerError(HttpErrorHandler.scala:206) at play.api.GlobalSettings$class.onError(GlobalSettings.scala:160) at play.api.DefaultGlobal$.onError(GlobalSettings.scala:188) at play.api.http.GlobalSettingsHttpErrorHandler.onServerError(HttpErrorHandler.scala:98) at play.core.server.netty.PlayRequestHandler$$anonfun$2$$anonfun$apply$1.applyOrElse(PlayRequestHandler.scala:100) at play.core.server.netty.PlayRequestHandler$$anonfun$2$$anonfun$apply$1.applyOrElse(PlayRequestHandler.scala:99) at scala.concurrent.Future$$anonfun$recoverWith$1.apply(Future.scala:344) at scala.concurrent.Future$$anonfun$recoverWith$1.apply(Future.scala:343) at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32) Caused by: java.util.concurrent.CompletionException: java.lang.NullPointerException at java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:292) at java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:308) at java.util.concurrent.CompletableFuture.uniApply(CompletableFuture.java:593) at java.util.concurrent.CompletableFuture$UniApply.tryFire(CompletableFuture.java:577) at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:474) at java.util.concurrent.CompletableFuture.completeExceptionally(CompletableFuture.java:1977) at scala.concurrent.java8.FuturesConvertersImpl$CF.apply(FutureConvertersImpl.scala:21) at scala.concurrent.java8.FuturesConvertersImpl$CF.apply(FutureConvertersImpl.scala:18) at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32) at scala.concurrent.BatchingExecutor$Batch$$anonfun$run$1.processBatch$1(BatchingExecutor.scala:63) Caused by: java.lang.NullPointerException: null at controllers.HomeController.addPerson(HomeController.java:62) at router.Routes$$anonfun$routes$1$$anonfun$applyOrElse$2$$anonfun$apply$2.apply(Routes.scala:293) at router.Routes$$anonfun$routes$1$$anonfun$applyOrElse$2$$anonfun$apply$2.apply(Routes.scala:293) at play.core.routing.HandlerInvokerFactory$$anon$4.resultCall(HandlerInvoker.scala:157) at play.core.routing.HandlerInvokerFactory$$anon$4.resultCall(HandlerInvoker.scala:156) at play.core.routing.HandlerInvokerFactory$JavaActionInvokerFactory$$anon$14$$anon$3$$anon$1.invocation(HandlerInvoker.scala:136) at play.core.j.JavaAction$$anon$1.call(JavaAction.scala:73) at play.http.HttpRequestHandler$1.call(HttpRequestHandler.java:54) at play.db.jpa.TransactionalAction.lambda$call$4(TransactionalAction.java:28) at play.db.jpa.DefaultJPAApi.lambda$withTransaction$3(DefaultJPAApi.java:196)
Jak to ale udelat v Play? Na strance mam html select se seznamem adres. Pokud ale chci vytvorit noveho uzivatele, spadne to.
Co delam spatne?
Pro plný přístup na Devel.cz se prosím přihlaste:
Nebo se přihlaste jménem a heslem: