Warum ist Spring @Value nicht mit @Controller kompatibel?

Ich bin auf der Suche nach einem besseren Verständnis für dieses Problem. Eine Problemumgehung ist ziemlich einfach: Verschieben Sie die Konfigurationsdaten in eine andere Klasse, in der keine Proxies / Ratschläge eingebunden sind. Wenn Sie dies jedoch besser verstehen, können Sie in Zukunft andere Probleme vermeiden zur Verfügung stellen können.

Ich verwende Spring 3.1.0.RELEASE mit Spring STS und dem vFabric tc-Server. Implementierte einen einfachen kleinen REST-Server mit einer @Controller-Klasse. Das ist alles großartig (wirklich), aber der @Controller ist auch @Transactional, und zwischen dem Weben der Ladezeit und dem vFabric tc-Server bricht @Value.

<code>@Controller
@RequestMapping("/hello")
public class MyAPI {

    @Value("${my.property}")
    private String prop;
    ...

    @Transactional
    handleRequest(...) ...


}
</code>

Und eine Eigenschaftendatei app.properties:

<code>my.property = SUCCESS
</code>

Dies funktioniert einwandfrei unter JUnit, wenn der Test ein MyAPI-Objekt abruft, dessen Requisite auf "SUCCESS" gesetzt ist. Wenn die App jedoch in vFabric geladen wird, wird die Ladezeit voraussichtlich überschritten und die Proxies werden ausgeführt. Was auch immer passiert, es werden zwei MyAPI-Instanzen erstellt, eine mit prop == "SUCCESS" und eine andere (die leider die http-Anfrage bearbeitet) mit prop == "$ {my.prop}".

Alles in allem nenne ich dies ein Versagen der Magie, was meine größte Sorge bei der Verwendung von Dingen wie AOP ist. Selbst mit STS weiß ich nicht, wie ich die Ursache für das Problem finden oder herausfinden kann, ob dies ein schwerwiegender Fehler ist. Wenn es sich um einen Fehler handelt, weiß ich nicht, ob es sich um einen Fehler in Spring, AspectJ, dem Load-Time-Weaver oder vFabric handelt. Daher weiß ich nicht einmal, wo ich einen Fehlerbericht einreichen soll.

Jede Hilfe zum Verständnis wäre willkommen. Vielen Dank.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage