Mein Team verwaltet eine Webanwendung, die mit Spring Boot, Spring Data, Thymeleaf und JPA/Hibernate erstellt wurde. Wir schlagen vor kurzem ein Problem mit einem Ausdruck Thymeleaf Vorlage Springels andernfalls aufgrund eines Problems Typumwandlung bewerten:Soll der DomainClassConverter von SpringData mit Hibernate-Proxies arbeiten?
Verursacht durch: org.springframework.core.convert.ConverterNotFoundException: Nein Konverter gefunden Lage, vom Typ Umwandlung [com .xyz.app.model.Employee _ $$ _ jvst7ca_34] eingeben [java.lang.String]
der Ausdruck ist $ {{Mitarbeiter}}, wo ein Mitarbeiter ein Unternehmen in das Modell durch eine Feder-Controller platziert ist. Die Mitarbeiter Einheit ist mit einem einfachen Aufruf zu einem Repository Spring Data abgerufen:
@ModelAttribute("employee")
public Employee getEmployee(@PathVariable("employeeId") long employeeId) {
return employeeRepository.findOne(employeeId);
}
Während des Debuggen, bemerkte ich, dass die Employee-Entität zurückgegeben wird, ist eigentlich ein Hibernate-Proxy, wie Sie in der Ausnahme Ursache aus dem Protokoll sehen - die Employee-Klasse hat den Javassist Suffix: _$$_jvst7ca_34
Spring Data Register DomainClassConverter
mit Spring GenericConversionService
, die wie $ eine Einheit auf eine ID für einen Ausdruck umwandeln sollten {{Mitarbeiter}}, wenn die @EnableSpringDataWebSupport
Anmerkung vorhanden ist. Spring Boot bietet eine Autokonfigurationsklasse SpringDataWebAutoConfiguration
, die dies standardmäßig aktiviert. Ich habe bestätigt, dass diese Autokonfigurationsklasse von unserer Anwendung angewendet wird.
Ich bestätigte auch durch das Debuggen, dass die GenericConversionService
die DomainClassConverter.ToIdConverter
abruft, wenn versucht wird, von Employee _ $$ _ jvst7ca_34 in String zu konvertieren. DomainClassConverter.ToIdConverter.matches(sourceType, targetType)
gibt jedoch false zurück, so dass der Konverter nicht verwendet wird. Es gibt false zurück, weil es kein Repository in Repositories
mit dem Typ Employee_$$_jvst7ca_34
finden kann. Ich sehe mit dem Debugger, dass das einzige Employee-Repository in der Liste der Repositories für Employee
ist.
Ist das ein Fehler in ? Sollte es nicht in der Lage sein, ein Repository für einen Proxy abzurufen? Es scheint, dass Proxies recht häufig vorkommen sollten, da jede Entität mit einer faulen Sammlung (der empfohlene Sammlungstyp) als Proxy zurückkommt. Oder machen wir etwas falsch? Irgendwelche Hinweise würden sehr geschätzt werden!