2014-10-10 5 views
7

Wir versuchen eine POC mit Spring-Data-JPA und Spring-Data-Rest. Die Ausgabe sieht wie folgt aus: Wir haben die Werte unserer Entitätsfelder mit Ausnahme der ID, das ID-Feld wird in einer Abstract-Klasse festgelegt.Die JPA-Entitäts-ID kann nicht in der JSON-Ausgabe abgerufen werden

Wir verwenden eine einfache Entität, die sich auf AbstractPersistable erstreckt (es ist eine Spring-Data-JPA-Klasse http://docs.spring.io/spring-data/jpa/docs/current/api/org/springframework/data/jpa/domain/AbstractPersistable.html).

Hier ist der Quellcode dieser:

@MappedSuperclass 
public abstract class AbstractPersistable<PK extends Serializable> implements Persistable<PK> { 

    private static final long serialVersionUID = -5554308939380869754L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "ID") 
    private PK id; 

    /* 
    * (non-Javadoc) 
    * 
    * @see org.springframework.data.domain.Persistable#getId() 
    */ 
    public PK getId() { 

     return id; 
    } 

    /** 
    * Sets the id of the entity. 
    * 
    * @param id the id to set 
    */ 
    protected void setId(final PK id) { 

     this.id = id; 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see org.springframework.data.domain.Persistable#isNew() 
    */ 
    public boolean isNew() { 

     return null == getId(); 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see java.lang.Object#toString() 
    */ 
    @Override 
    public String toString() { 

     return String.format("Entity of type %s with id: %s", this.getClass().getName(), getId()); 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see java.lang.Object#equals(java.lang.Object) 
    */ 
    @Override 
    public boolean equals(Object obj) { 

     if (null == obj) { 
      return false; 
     } 

     if (this == obj) { 
      return true; 
     } 

     if (!getClass().equals(obj.getClass())) { 
      return false; 
     } 

     AbstractPersistable<?> that = (AbstractPersistable<?>) obj; 

     return null == this.getId() ? false : this.getId().equals(that.getId()); 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see java.lang.Object#hashCode() 
    */ 
    @Override 
    public int hashCode() { 

     int hashCode = 17; 

     hashCode += null == getId() ? 0 : getId().hashCode() * 31; 

     return hashCode; 
    } 
} 

und unsere Einheit:

@Entity 
@Table(name = "TEST_ENTITY") 
public class TestEntity extends AbstractPersistable<Long> { 

    @Column(name = "TITLE", nullable = false, length = 100) 
    private String title; 

    @Column(name = "DESCRIPTION", length = 500) 
    private String description; 

    @ManyToOne(fetch = FetchType.LAZY, optional = false) 
    @JoinColumn(name = "GLOBAL_DATATYPE_ID", referencedColumnName = "ID", nullable = false, updatable = false) 
    private GlobalDataType dataType; 

    @Enumerated(EnumType.STRING) 
    @Column(name = "VALUE_TYPE", nullable = false, length = 30) 
    private ValueType valueType; 

    @Enumerated(EnumType.STRING) 
    @Column(name = "ATTRIBUTE_TYPE", nullable = false, length = 30) 
    private AttributeType attributeType; 

    @Column(name = "FE_DISPLAY") 
    @Convert(converter=BooleanTFConverter.class) 
    private Boolean feDisplay; 

{... getter setter equals hashcode toString ...} 
} 

dann die der Dienst (mit Feder-data-rest):

@RepositoryRestResource(path = "test") 
public interface TestEntityRepository extends JpaRepository<TestEntity, Long> { 
} 

Wir starten die App mit Spring boot Und die Ausgabe in Chrome (URL ist http://localhost:8080/test) ist ein JSON + HAL-Daten (die ID wird nicht angezeigt ed !!!):

{ 
    "_links" : { 
    "self" : { 
     "href" : "http://localhost:8080/test{?page,size,sort}", 
     "templated" : true 
    } 
    }, 
    "_embedded" : { 
    "testEntities" : [ { 
     "title" : "Test", 
     "description" : "TEST", 
     "valueType" : "SINGLE", 
     "attributeType" : "ATTRIBUTE", 
     "feDisplay" : true, 
     "new" : false, 
     "_links" : { 
     "self" : { 
      "href" : "http://localhost:8080/test/1" 
     }, 
     "dataType" : { 
      "href" : "http://localhost:8080/test/1/dataType" 
     } 
     } 
    } ] 
    }, 
    "page" : { 
    "size" : 20, 
    "totalElements" : 1, 
    "totalPages" : 1, 
    "number" : 0 
    } 
} 

Und eine andere Sache ist, wenn wir AbstractAuditable auf dem TestEntity (http://docs.spring.io/spring-data/jpa/docs/current/api/org/springframework/data/jpa/domain/AbstractAuditable.html) verwenden, es funktioniert, bekommen wir die Felder Werte von AbstractAuditable aber wir haben noch nicht bekommen, die id ...

@Entity 
@Table(name = "TEST_ENTITY") 
public class TestEntity extends AbstractAuditable<User, Long> { 
... 
} 

@MappedSuperclass 
public abstract class AbstractAuditable<U, PK extends Serializable> extends AbstractPersistable<PK> implements 
     Auditable<U, PK> { 

    private static final long serialVersionUID = 141481953116476081L; 

    @ManyToOne(fetch = FetchType.LAZY, optional = false) 
    @JoinColumn(name = "CREATED_BY", referencedColumnName = "ID", nullable = false, updatable = false) 
    private U createdBy; 

    @Temporal(TemporalType.TIMESTAMP) 
    @Column(name = "CREATED_DATE") 
    private Date createdDate; 

    @ManyToOne(fetch = FetchType.LAZY, optional = false) 
    @JoinColumn(name = "LAST_MODIFIED_BY", referencedColumnName = "ID", nullable = false, updatable = false) 
    private U lastModifiedBy; 

    @Temporal(TemporalType.TIMESTAMP) 
    @Column(name = "LAST_MODIFIED_DATE") 
    private Date lastModifiedDate; 

    /* 
    * (non-Javadoc) 
    * 
    * @see org.springframework.data.domain.Auditable#getCreatedBy() 
    */ 
    public U getCreatedBy() { 

     return createdBy; 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see 
    * org.springframework.data.domain.Auditable#setCreatedBy(java.lang.Object) 
    */ 
    public void setCreatedBy(final U createdBy) { 

     this.createdBy = createdBy; 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see org.springframework.data.domain.Auditable#getCreatedDate() 
    */ 
    public DateTime getCreatedDate() { 

     return null == createdDate ? null : new DateTime(createdDate); 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see 
    * org.springframework.data.domain.Auditable#setCreatedDate(org.joda.time 
    * .DateTime) 
    */ 
    public void setCreatedDate(final DateTime createdDate) { 

     this.createdDate = null == createdDate ? null : createdDate.toDate(); 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see org.springframework.data.domain.Auditable#getLastModifiedBy() 
    */ 
    public U getLastModifiedBy() { 

     return lastModifiedBy; 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see 
    * org.springframework.data.domain.Auditable#setLastModifiedBy(java.lang 
    * .Object) 
    */ 
    public void setLastModifiedBy(final U lastModifiedBy) { 

     this.lastModifiedBy = lastModifiedBy; 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see org.springframework.data.domain.Auditable#getLastModifiedDate() 
    */ 
    public DateTime getLastModifiedDate() { 

     return null == lastModifiedDate ? null : new DateTime(lastModifiedDate); 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see 
    * org.springframework.data.domain.Auditable#setLastModifiedDate(org.joda 
    * .time.DateTime) 
    */ 
    public void setLastModifiedDate(final DateTime lastModifiedDate) { 

     this.lastModifiedDate = null == lastModifiedDate ? null : lastModifiedDate.toDate(); 
    } 
} 

und JSON + HAL Ergebnis:

{ 
    "_links" : { 
    "self" : { 
     "href" : "http://localhost:8080/test{?page,size,sort}", 
     "templated" : true 
    } 
    }, 
    "_embedded" : { 
    "testEntities" : [ { 
     "createdBy" : { 
     "username" : "xxx.admin" 
     }, 
     "createdDate" : { 
     "year" : 2014, 
     "era" : 1, 
     "dayOfYear" : 282, 
     "dayOfWeek" : 4, 
     "dayOfMonth" : 9, 
     "weekOfWeekyear" : 41, 
     "monthOfYear" : 10, 
     "yearOfEra" : 2014, 
     "yearOfCentury" : 14, 
     "centuryOfEra" : 20, 
     "weekyear" : 2014, 
     "millisOfSecond" : 0, 
     "millisOfDay" : 65724000, 
     "secondOfMinute" : 24, 
     "secondOfDay" : 65724, 
     "minuteOfHour" : 15, 
     "minuteOfDay" : 1095, 
     "hourOfDay" : 18, 
     "chronology" : { 
      "zone" : { 
      "fixed" : false, 
      "uncachedZone" : { 
       "cachable" : true, 
       "fixed" : false, 
       "id" : "Europe/London" 
      }, 
      "id" : "Europe/London" 
      } 
     }, 
     "zone" : { 
      "fixed" : false, 
      "uncachedZone" : { 
      "cachable" : true, 
      "fixed" : false, 
      "id" : "Europe/London" 
      }, 
      "id" : "Europe/London" 
     }, 
     "millis" : 1412874924000, 
     "afterNow" : false, 
     "beforeNow" : true, 
     "equalNow" : false 
     }, 
     "lastModifiedBy" : null, 
     "lastModifiedDate" : { 
     "year" : 2014, 
     "era" : 1, 
     "dayOfYear" : 282, 
     "dayOfWeek" : 4, 
     "dayOfMonth" : 9, 
     "weekOfWeekyear" : 41, 
     "monthOfYear" : 10, 
     "yearOfEra" : 2014, 
     "yearOfCentury" : 14, 
     "centuryOfEra" : 20, 
     "weekyear" : 2014, 
     "millisOfSecond" : 0, 
     "millisOfDay" : 65731000, 
     "secondOfMinute" : 31, 
     "secondOfDay" : 65731, 
     "minuteOfHour" : 15, 
     "minuteOfDay" : 1095, 
     "hourOfDay" : 18, 
     "chronology" : { 
      "zone" : { 
      "fixed" : false, 
      "uncachedZone" : { 
       "cachable" : true, 
       "fixed" : false, 
       "id" : "Europe/London" 
      }, 
      "id" : "Europe/London" 
      } 
     }, 
     "zone" : { 
      "fixed" : false, 
      "uncachedZone" : { 
      "cachable" : true, 
      "fixed" : false, 
      "id" : "Europe/London" 
      }, 
      "id" : "Europe/London" 
     }, 
     "millis" : 1412874931000, 
     "afterNow" : false, 
     "beforeNow" : true, 
     "equalNow" : false 
     }, 
     "title" : "Test", 
     "description" : "TEST", 
     "valueType" : "SINGLE", 
     "attributeType" : "ATTRIBUTE", 
     "feDisplay" : true, 
     "new" : false, 
     "_links" : { 
     "self" : { 
      "href" : "http://localhost:8080/test/1" 
     }, 
     "dataType" : { 
      "href" : "http://localhost:8080/test/1/dataType" 
     } 
     } 
    } ] 
    }, 
    "page" : { 
    "size" : 20, 
    "totalElements" : 1, 
    "totalPages" : 1, 
    "number" : 0 
    } 
} 

EDIT: Lösung

Fügen Sie eine benutzerdefinierte RepositoryRestMvcConfiguration

@Configuration 
public class MyRepositoryRestMvcConfiguration extends RepositoryRestMvcConfiguration { 

    protected void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) { 
     config.exposeIdsFor(TestEntity.class); 
    } 
} 

Dann

Vor dem @import in Ihrer Java-Anwendung Config-Klasse ändern:

@Configuration 
@EnableTransactionManagement 
@Import(RepositoryRestMvcConfiguration.class) 
@EnableJpaRepositories(basePackages="uk.co.xxx.marketplace.data.repository") 
@PropertySources({@PropertySource("classpath:hibernate.properties"),@PropertySource("classpath:persistence.properties")}) 
@ComponentScan(value = "uk.co.xxx.marketplace.data") 
@EnableAutoConfiguration 
public class Application { 
... 
} 

Aktuell:

@Configuration 
@EnableTransactionManagement 
@Import(MyRepositoryRestMvcConfiguration.class) 
@EnableJpaRepositories(basePackages="uk.co.xxx.marketplace.data.repository") 
@PropertySources({@PropertySource("classpath:hibernate.properties"),@PropertySource("classpath:persistence.properties")}) 
@ComponentScan(value = "uk.co.xxx.marketplace.data") 
@EnableAutoConfiguration 
public class Application { 
... 
} 

Antwort

5

Sie können die Klassenunterklasse RepositoryRestConfiguration (oder RepositoryRestMVCConfiguration, wenn Spring MV verwendet wird C), und rufen Sie die Methode exposeIdSFor() mit Ihren Domänenklassen auf, für die Sie die IDs bereitstellen möchten.

+0

perfekt funktioniert es Ich füge einen EDIT-Abschnitt für die Lösung hinzu –

+0

Was ist, wenn Spring nicht verwendet wird? Ich benutze Eclipselink ohne Feder. –

+0

Auch wenn Sie Spring nicht verwenden, müssen Sie Spring Data REST konfigurieren, was durch die Klasse RepositoryRestConfiguration geschieht. – dunni

Verwandte Themen