エンティティからファイル名を生成するためにSpELテンプレートを使用しようとしています。 JPEL/Hibernateエンティティで動作しないSpring式言語(SpEL)
@Entity
public class Invoice implements Serializable {
private String invoicenumber;
private Customer customer;
@Column(name = "invoicenumber", nullable = false, length = 20)
public String getInvoicenumber() {
return this.invoicenumber;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "fk_customer", nullable = false)
public Customer getCustomer() {
return this.customer;
}
}
@Entity
public class Customer implements Serializable {
private String firstname;
private String lastname;
@Column(name = "firstname", nullable = false, length = 20)
public String getFirstname() {
return this.firstname;
}
@Column(name = "lastname", nullable = false, length = 20)
public String getLastname() {
return this.lastname;
}
}
そして、これと同じSPELテンプレート:それから私は、請求書オブジェクトとテンプレートからファイル名を生成するために、SPELを
String template = "invoicenumber + '-' + customer.firstname + ' ' + customer.lastname";
使用し、私はこれらのようになり、2つのエンティティをしている
public String generateFilename(String filenameTemplate, Object dataObject) {
ExpressionParser parser = new SpelExpressionParser();
Expression expression = parser.parseExpression(filenameTemplate);
return expression.getValue(dataObject, String.class);
}
このテストは動作します:
String testTemplate = "invoicenumber + '-' + customer.firstname + ' ' + customer.lastname";
Invoice invoice = new Invoice();
invoice.setInvoicenumber("BF2016-06-ABCDEF");
invoice.setCustomer(new Customer());
invoice.getCustomer().setFirstname("Hans");
invoice.getCustomer().setLastname("Hansen");
assertEquals("BF2016-06-ABCDEF-Hans Hansen", generator.generateFilename(testTemplate, invoice));
このテストはしていません:
Invoice invoice = invoiceRepository.findOne(4);
String template = "invoicenumber + '-' + customer.firstname + ' ' + customer.lastname";
String filename = filenameGenerator.generateFilename(template, invoice);
assertEquals("12344-201601-Heinrich Jahnke", filename);
このテストでは、実際に遅延ローディングのために、顧客のオブジェクトを使用休止プロキシが問題であることを、仮定に私をリードしている、「12344-201601-」になり。 firstnameとlastnameフィールドは、レンダリングされたファイル名を説明する、データベースからロードされる前にヌルです。
これを修正する方法についてのご意見はありますか?私はすでに試したいくつかのもの:使用
Hibernate.initialize(invoice);
Hibernate.initialize(invoice.getCustomer());
System.out.println(invoice.getCustomer().getFirstname());
- "customer.getFirstnameを()" の代わりに "customer.firstname" の表現
- の私FilenameGeneratorクラスに@Transactionalを追加
FetchType.EAGERを使用すると機能しますか?つまり、いずれにしても動作すると期待していますが、SpELが遅延読み込みプロキシを正しく使用していないかどうかを確認するのに役立ちます –