Spring Erweitern von Entities

Marsman

Bekanntes Mitglied
Hallo Ihr!

Ich hätte mal eine Frage zum Best Practice beim Erweitern von Persistente Entities im Zusammenhang mit Spring MVC. Insbesondere bei einer Collection von Entities.

Angenommen ich habe eine List<Image>, übergebe diese durch den Controller im Response (ModelAndView) an eine JSP. Dort wird diese Liste mit dem JSTL-Tag c:forEach ausgegeben. Soweit wie üblich. Nun soll je Bild noch eine URL ausgegeben werden, die sich aus Properties von Image und einer konfigurierten Basis-URL zusammensetzt. Diese möchte ich nicht auf der JSP (im View) zusammensetzen.

Wie geht man nun am Besten vor? Spontan fällt mir ein, eine Wrapper-Klasse für Image zu erstellen, dort eine Methode getImageUrl() zu implementieren und im Controller List<Image> zu List<ImageWrapper> zu kopieren. Oder von Image zu erweitern. Dabei habe ich aber Probleme mit dem Persistence-Framework bekommen. Gibt es bessere Lösungen? Idealerweise Spring-konform. Wie wird so etwas in der Praxis realisiert?

Java:
public class ImageWrapper {

  private Image image;

  @Autowired
  private SeoService seoService;

  public String getImageUrl() {
    return this.seoService.getImageUrl(image.getTitle());
  }
}
HTML:
<c:forEach var="imageWrapper"> items="${imageWrappers}">
  <img src="${imageWrapper.imageUrl}" alt="${imageWrapper.image.title}" />
</c:forEach>

Danke, Thomas
 

Marsman

Bekanntes Mitglied
Schade, keine Antwort. War meine Frage zu blöd oder zu kompliziert?

Im Grunde geht es mir darum, in meiner Web App eine Bean programmatisch zu instanziieren und in dieser Bean auf Services zugreifen zu können, die von Spring injected werden. Und falls möglich per Annotationen. Ich habe etwas über ApllicationContext und BeanFactory gelesen, komme da aber nicht richtig weiter.

Gruß, Thomas
 

stg

Top Contributor
Beim "normalen" JPA kannst du zusätzliche Attribute/Methoden mit der Annotation
Code:
@Transient
versehen, diese werden dann nicht persistiert und einfach "überlesen". Mit Spring gibt es bestimmt was Vergleichbares.
 

Marsman

Bekanntes Mitglied
...das mit dem @Transient kenne ich. Ich möchte meine zusätzlichen Getter nicht in der Entity-Klasse selbst platzieren. Wenn ich von der Entity-Klasse erweitere (ImageWrapper extends Image), weiß ich nicht wie ich ImageWrapper instanziieren soll.

Java:
public class ImageWrapper extends Image {

  @Autowired
  private SeoService seoService;
 
  @Transient
  public String getImageUrl() {
    return this.seoService.getImageUrl(image.getTitle());
  }
}

Gruß, Thomas
 

Marsman

Bekanntes Mitglied
Hallo nochmal,

ich habe inzwischen selbst eine akzeptable Lösung gefunden. Mit einer Annotated Bean Factory und Beans im Prototype Scope.

Gruß, Thomas
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben