2016-07-01 26 views
5

Sto tentando di utilizzare un modello SpEL per generare il nome file da entità. Ho due entità che sembrano simili a questi: Spring expression language (SpEL) non funziona su JPA/hibernate entity

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

e un template SPEL simile a questo:

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

allora io uso SPEL per generare un nome di file da un modello con un oggetto di fattura

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

Questo test funziona:

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

Questa prova non è così:

Invoice invoice = invoiceRepository.findOne(4); 

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

Questo test in realtà si traduce in "12344-201601-", che mi porta all'assunzione, la regolarità delle deleghe hibernate utilizzati per pigri carico l'oggetto del cliente sono il problema . I campi nome e cognome sono nulli prima che vengano caricati dal database, il che spiegherebbe il nome file visualizzato.

Qualche idea su come risolvere questo problema? alcune cose che ho già provato:

Hibernate.initialize(invoice); 
Hibernate.initialize(invoice.getCustomer()); 
System.out.println(invoice.getCustomer().getFirstname()); 
  • Utilizzando "customer.getFirstname()" invece di "customer.firstname" nell'espressione
  • Aggiunta @Transactional alla mia classe FilenameGenerator
+0

Funziona se si utilizza FetchType.EAGER? Voglio dire, mi aspetterei che funzioni in entrambi i modi, ma potrebbe aiutare a confermare se lo SpEL non sta usando correttamente i proxy pigri del caricamento –

risposta

1

Il il problema era da qualche altra parte, Spel e JPA/Hibernate stanno lavorando bene insieme. Perdonami per quello!

La mia espressione reale si presentava così:

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

Purtroppo il cliente che è stato caricato dal database ha avuto una società, una società vuota ... Con espressione seguente tutto funziona correttamente:

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