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:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.