2016-07-01 30 views
5

Immunlardan dosya adı oluşturmak için bir SpEL şablonu kullanmaya çalışıyorum. Ben bunlara benzer iki varlık vardır: Spring İfade dili (SpEL) JPA/hazırda bekletme öğesi üzerinde çalışmayan

@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; 
    } 
} 

Ve benzer bir Spel şablon bu bir: Sonra

String template = "invoicenumber + '-' + customer.firstname + ' ' + customer.lastname"; 

i bir fatura nesneyle şablondan bir dosya adı oluşturmak için Oyunu kullanmak

public String generateFilename(String filenameTemplate, Object dataObject) { 
    ExpressionParser parser = new SpelExpressionParser(); 
    Expression expression = parser.parseExpression(filenameTemplate); 
    return expression.getValue(dataObject, String.class); 
} 

Bu test çalışır:

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)); 

Bu test yapmaz:

Invoice invoice = invoiceRepository.findOne(4); 

String template = "invoicenumber + '-' + customer.firstname + ' ' + customer.lastname"; 
String filename = filenameGenerator.generateFilename(template, invoice); 
assertEquals("12344-201601-Heinrich Jahnke", filename); 

Bu test aslında tembel yükleme için müşteri nesne kullanılan hazırda vekiller sorun olduğunu, varsayımına götürüyor, hangi "12344-201601-" sonuçlanır . İlk ad ve soyadı alanları, veritabanından yüklenmeden önce boştur ve bu da işlenen dosya adını açıklar.

Bunu nasıl düzeltebileceğiniz hakkında bir fikriniz var mı? bazı şeyler zaten denedim:

Hibernate.initialize(invoice); 
Hibernate.initialize(invoice.getCustomer()); 
System.out.println(invoice.getCustomer().getFirstname()); 
  • ifadede yerine "customer.firstname" nin "customer.getFirstname()" kullanarak benim FilenameGenerator sınıfına @Transactional ekleme
+0

FetchType.EAGER kullanırsanız işe yarar mı? Yani, her iki şekilde çalışmasını beklerdim, ancak SpEL'in tembel yükleme proxy'lerini doğru kullanıp kullanmadığını doğrulamaya yardımcı olabilir. –

cevap

1

Sorun başka bir yerdi, Spel ve JPA/Hibernate birlikte çalışıyorlar. Bunun için özür dilerim!

"invoicenumber + '-' + (customer.company == null ? customer.fname + ' ' + customer.sname : customer.company)" 

Ne yazık ki ifade her şeyi aşağıdaki ile bir şirket, boş bir şirket ... var mı veritabanından yüklendi müşteri doğru bir şekilde çalışır::

Benim gerçek ifade bu benziyordu

"invoicenumber + '-' + (customer.company == null or customer.company.isEmpty() ? customer.fname + ' ' + customer.sname : customer.company)" 
İlgili konular