in meiner aktuellen Implementierung mit Spring-Boot, -HATEOAS, -Rest-Daten Ich versuche einige weitere Ruhe-Anrufe zu verschonen und meine Ruhe Ressource für Kredite zu verbessern, um auch Beziehungen eines Kredits zu liefern (siehe unten Konto wie ManyToOne und creditBookingClassPayments als OneToMany). Das Problem ist jetzt, dass ich es nicht ausführen kann. Der Aufruf liefert immer leere Beziehungen. Ich würde mich über Hilfe sehr freuen.Enhanced Spring Data Rest liefert leere Beziehungen
hier die Umgebung:
Credit.java
@Entity
@Getter
@Setter
public class Credit {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Setter(NONE)
@Column(name = "id")
private Long itemId;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="account_id", nullable = false)
private Account account;
@OneToMany(mappedBy = "credit")
private List<CreditBookingClassPayment> creditBookingClassPayments = new ArrayList<>();
@NotNull(message="Please enter a valid short name.")
@Column(length = 10, nullable = false)
private String shortName;
@NotNull(message="Please enter a valid name.")
@Column(nullable = false)
private String name;
...
}
CreditRepositoryCustomImpl.java
QueryDsl verwendet die Kredit Ressource mit seiner realation
...
@Override
public List<Credit> findDistinctByAccountItemIdNew(Long accountId) {
QCredit credit = QCredit.credit;
QAccount account = QAccount.account;
QCreditBookingClassPayment creditBookingClassPayment = QCreditBookingClassPayment.creditBookingClassPayment;
QBookingClass bookingClass = QBookingClass.bookingClass;
BooleanExpression hasAccountItemId = credit.account.itemId.eq(accountId);
List<Credit> credits = from(credit).where(hasAccountItemId)
.innerJoin(credit.account, account)
.leftJoin(credit.creditBookingClassPayments, creditBookingClassPayment)
.leftJoin(creditBookingClassPayment.bookingClass, bookingClass).groupBy(credit.itemId).fetch();
return credits;
}
...
zu verbessern
CreditController.java
Blick in Response hier alle (Konto- und Kreditzahlungen) für Kredite
verfügbar@RepositoryRestController
public class CreditController {
@Autowired
private CreditRepository creditRepository;
@RequestMapping(value = "/credit/search/findAllByAccountItemIdNew", method= RequestMethod.GET, produces = MediaTypes.HAL_JSON_VALUE)
@ResponseBody
public ResponseEntity<Resources<PersistentEntityResource>> findAllByAccountItemIdNew(@RequestParam Long accountId, PersistentEntityResourceAssembler persistentEntityResourceAssembler) {
List<Credit> credits = creditRepository.findDistinctByAccountItemIdNew(accountId);
Resources<PersistentEntityResource> responseBody = new Resources<PersistentEntityResource>(credits.stream()
.map(persistentEntityResourceAssembler::toResource)
.collect(Collectors.toList()));
return ResponseEntity.ok(responseBody);
}
}
CreditResourceIntegrTest.java
hier creditResourcesEntity den Kredit halten, aber Konto null und creditBookingClassPayment ist ein leeres Array
@Test
public void testFindAllByAccountItemId() throws URISyntaxException {
URIBuilder builder = new URIBuilder(creditFindAllByAccountItemIdRestUrl);
builder.addParameter("accountId", String.valueOf(EXPECTED_ACCOUNT_ID));
builder.addParameter("projection", "base");
RequestEntity<Void> request = RequestEntity.get(builder.build())
.accept(MediaTypes.HAL_JSON).acceptCharset(Charset.forName("UTF-8")).build();
ResponseEntity<Resources<Resource<Credit>>> creditResourcesEntity =
restTemplate.exchange(request, new ParameterizedTypeReference<Resources<Resource<Credit>>>() {});
assertEquals(HttpStatus.OK, creditResourcesEntity.getStatusCode());
//assertEquals(EXPECTED_CREDIT_COUNT, creditResourcesEntity.getBody().getContent().size());
}
Vermisse ich etwas?
Danke für Ihre Hilfe! Karsten