Beware of multiple Spring PropertyPlaceholderConfigurers and default values

I’ve seen quite a lot of Spring projects over the years that use multiple PropertyPlaceholderConfigurer instances in the same bean factory.
Consider a project where maven module A depends on maven module B in the same maven project. The idea is that module A is self-sustaining and loads its own property files, and module B does as well. This philosophy is good, but can lead to a horrible mess when used in combination with default values.

The problem setup

You have a Spring project with two PropertyPlaceholderConfigurer instances, each loading their own property file, and one Spring Bean that has a @Value injection with a default value.

Furthermore, you have the two property files where the first property file is missing the property and the second property file actually has it.

application.properties

application1.properties

The symptoms

The bean receives the default value "defaultValue", although property placeholder 2 actually has a value “value2” for this property.

The cause

PropertyPlaceholderConfigurer instances don’t know about each other’s existence. What happened here is:

  1. Property placeholder 1 tries to resolve the value of myKey. It doesn’t have a value for that, but “fortunately” the bean specifies a default value, so it uses that.
  2. Property placeholder 2 sees that the bean already has received a value (set by Property placeholder 1), so it ignores it.

Using ignoreUnresovablePlaceholders doesn’t help because the placeholder configurers will still use the default value if encountered on a bean.

To make matters even worse, Spring shows undeterministic behaviour here, because it uses unordered hashmaps internally that result in property placeholder 2 sometimes being fired before property placeholder 1. The Spring Bean then actually receives value “value2” which is what we would expect. I’ve seen two log files where starting the Spring container a second time reverses the order in which the property placeholder configurers are loaded.

I guess that propertyplaceholder configurers not knowing about each other is by design, but the above can be a big gotcha.

I’ve posted a sample project on GitHub that reproduces the problem. If you run the unit test multiple times it will inevitably fail at some point.

The solution alternatives

  1. Only use one PropertyPlaceholderConfigurer for your deployable unit (a WAR, for example), at the top level. I would recommend this solution first.
  2. Do not use defaults in your @Value statements. Instead, explicitly define all property values once and use this in combination with ignoreUnresovablePlaceholders on all property placeholder configurers. I consider this a brittle solution at best.

The Spring issue tracker describes the problem here. As of Spring 4.3.5 it is still unresolved.

Posted in Coding | Tagged | Leave a comment

Telfort glasvezel Internet & IPTV over 1 ethernet kabel

De situatie

Mijn Telfort abonnement heeft Internet en IPTV. Deze komen beide binnen op een Genexis glasvezel modem, zoals hieronder.
Internet komt binnen over poort 1 (E1), en IPTV over poort 2 (E2).

Het probleem

Ik heb in de woonkamer zowel mijn Amino IPTV ontvanger als een Raspberry Pi 3. Die laatste gebruik ik om films te bekijken en muziek te beluisteren vanaf mijn NAS (een Synology).
Aangezien Internet en IPTV op mijn glasvezelmodem twee gescheiden netwerken zijn, heb ik eigenlijk twee kabels nodig naar mijn woonkamer, eentje voor Internet en eentje voor IPTV.
Er ligt nu 1 kabel, en ik heb geen ruimte en geen zin om een tweede kabel te trekken. Je kan ook niet zomaar je router met de IPTV uitgang verbinden, dan gaat je hele netwerk over de rooie.

Hoe krijg ik nu toch IPTV en Internet beide tegelijk in mijn woonkamer?

  • Oplossingen als een PowerLAN werken bij mij niet echt goed, 1 keertje de wasmachine van de buren aan en de link tussen de twee stopcontact adapters is weg.
  • Een WIFI adapter op de IPTV ontvanger lost het probleem ook niet op. Je zit namelijk nog steeds met twee LANs.

De oplossing

Zowel IPTV als Internet over dezelfde kabel naar mijn woonkamer zou de beste oplossing zijn. En… dit kan! Het magische woord is standaard 802.1Q (zie hier voor een uitgebreide beschrijving). Deze persoon heeft het ook al eens uitgelegd, maar mijn netwerk is nog wat simpeler, dus de oplossing is daardoor hoop ik iets helderder.

Het idee is dat je op 1 fysiek netwerk twee virtuele LANS (VLANS) maakt en die strikt gaat scheiden.

De ingredienten

  • Twee zg. managed switches, switches die het 802.1Q protocol ondersteunen. Deze NetGear switches ondersteunen dit bijvoorbeeld, ik heb zelf de GS108E 8-poorts variant maar je kan ook de 5-poorts variant kopen. Een switch kost je ongeveer 30 tot 50 euro, dus voor max 100 euro ben je klaar.
  • Genoeg kabels, Cat5e+.

De plaatsing en bekabeling

  • Plaats 1 switch in je meterkast naast het glasvezelmodem en 1 switch in je woonkamer. Bij mij staat deze vlak bij de Animo / Raspberry Pi.
  • Plug de kabel die van de meterkast naar de woonkamer loopt in de woonkamer switch in poort 8. Dit wordt de zogenaamde Trunk waar beide netwerken overheen lopen.
  • Plug een korte kabel van de woonkamer switch naar de Animo in poort 7.
  • Plug een korte kabel van de woonkamer switch naar de Raspberry Pi in poort 1.
  • Plug de kabel die van de meterkast naar de woonkamer loopt in de meterkast switch in ook poort 8.
  • Plug een korte kabel van IPTV naar meterkast switch in poort 7 (beter is om dit even te laten tot de configuratie helemaal geregeld is).
  • Plug een korte kabel van de router naar de meterkast switch in poort 1.

De configuratie

Het idee is nu dat je twee virtuele LANs gaat gebruiken die over 1 fysiek netwerk lopen.
VLAN 01 is voor IPTV en VLAN 02 is voor Internet. Op poort 8 in de switch van de meterkast worden beide VLANs samengevoegd. Op poort 8 in de woonkamer worden de VLANs weer gescheiden. Zulke poorten noemen we “tagged”: Uitgaande pakketjes krijgen een tag (01 of 02) en op binnenkomende pakketjes wordt een tag verwacht, zodat deze aan de juiste “untagged” poorten kan worden toegewezen. “untagged” poorten zijn normale netwerk poorten waar andere apparatuur aan hangt.

Om dit te configureren kan je inloggen op de switches of de utility software van je switch merk. Dit verschilt natuurlijk per merk, ik laat beneden de config zien voor NetGear switches maar het principe is bij elk merk hetzelfde. Ik heb de configuratie van beide switches exact hetzelfde, zodat alles wat gemakkelijker te begrijpen is.

  • Zet je switches in 802.1Q modus.
  • Maak een extra VLAN aan (als voorbeeld hier identifier 02)
  • Op VLAN 01 komt het IPTV signaal. Hiervoor wordt de poort configuratie: poort 7 untagged (U), poort 8 tagged (T). Poort 1/6 niets invullen, hier wil je namelijk alleen maar het internet signaal overheen hebben en geen IPTV. In de woonkamer wordt poort 7 dus gebruikt om puur en alleen het IPTV signaal door te geven aan de Animo tv ontvanger.
  • Op VLAN 02 komt het Internet signaal. Hiervoor wordt de poort configuratie: poort 1 t/ 6 untagged (U), poort 8 tagged (T). Poort 7 niets invullen, hier wil je namelijk alleen maar IPTV op hebben en geen internet. Dat hebben we net geconfigureerd als VLAN 01.
  • Je moet ook nog per untagged poort aangeven op welk vlan de pakketjes die daar binnenkomen, horen, het zogenaamde PVID. Dus hierboven poort 1 /6 PVID 02, poort 7 PVID 02, en poort 8 iets invullen, 01 of 02, hier wordt niet naar gekeken. Persoonlijk lijkt mij deze stap overbodig omdat de twee stappen hierboven eigenlijk al definieren bij welk VLAN een poort hoort, dus welke PVID deze krijgt. Maar je moet het toch vullen.

Hieronder de plaatjes die bij de configuratie horen. Dit op beide switches doorvoeren. Hierna werkt zowel Internet als IPTV perfect in je woonkamer!

Posted in Coding | 3 Comments

Application configuration in JEE

Over the past years, the Spring Framework has given us many tools to simplify ease of application development.

One of the nicer features is Spring’s PropertyPlaceholderConfigurer, a BeanPostProcessor implementation that allows you to inject values from property files into your managed beans, making application configuration a breeze.

Setting up one is a little bit of xml configuration:

And then you can inject property values from your property file:

JEE doesn’t have a PropertyPlaceHolderConfigurer right out of the box so we have to come up with a different solution.

What JEE offers are producer methods. A producer method is a method that constructs an object of an arbitary type which can then be used by Context Dependency Injection (CDI) as a candidate for injection.

Producer methods use the @Produces annotation for indicating the kind of object it will produce.
The kind is indicated by the produced type and, optionally, a qualifier annotation.

Say that you want to indicate that some properties should be injected in your client class. We will put an custom annotation @ConfigurationValue on each field to indicate the field value should come from a property.

where you want to explicitly specify the property key on the first field to be populated, and just use the field name as a property key on the second field.

The qualifier @ConfigurationValue used by the object that requires configuration would look as follows:

The meta-annotation @Qualifier here indicates this annotation can be used for JEE’s CDI qualifying mechanism.

Now, we have to write a producer method that responds to fields using the @ConfigurationValue annotation.

An example of a producer method that retrieves its property values from a properties file could be the one below.

Of course, this only works for strings now, but it would be easy to extend in such a way that you would support numerical types as well, through multiple producer methods.

Posted in Coding | Leave a comment

Within Temptation – The Unforgiving – review


Within Temptation‘s vorige wrochtsel The Heart Of Everything was eigenlijk de perfectionering van alles wat de band vóór dat album gemaakt had. Een verschil in stijl ten opzichte van vorige albums was er eigenlijk niet (met uitzondering van wellicht Enter, wat nog steeds door fans van het eerste uur op handen wordt gedragen, ik vind het niks, maar goed).

Dus wat nu aan te vangen? Verder uitbouwen op hetgeen al prima was? Kan, maar Sharon den Adel en partner Robert Westerholt hebben besloten met het nieuwe album The Unforgiving het over een wat andere boeg te gaan gooien.

Ten eerste is er het heuse conceptverhaal, uitgewerkt door Steven O’Connell (bekend van Bloodrayne) en vervolgens als comic neergezet door Romano Molenaar. Daarnaast worden er nog een aantal korte films gedraaid waarvan single Faster het eerste resultaat was.

Nu klonk de single al fantastisch dus we waren zeer benieuwd naar het album als eindresultaat! 🙂

Een en ander doet me qua opzet erg denken aan Marillion die iets dergelijks probeerde te doen ten tijde van hun magnum opus Brave. Het artistieke resultaat daarvan was geweldig hoewel het geen commercieel succes was.

Maar waar Marillion’s product heel duidelijk een stuk lastig toegankelijke muziek was met daarbinnen zeer veel dynamiek, kiest Within Temptation voor een andere uitwerking. Wat opvalt is dat er relatief weinig rustige nummers zijn, elk nummer op The Unforgiving knalt je speakers uit. Daarnaast heeft elk nummer een sterke melodie als basis, en er is duidelijk meer nadruk op conventionele popstructuren met netjes twee coupletten, refrein, bruggetje etc. De jaren ’80 invloeden zijn dan ook onmiskenbaar. Het voelt dan ook meer als een collectie waanzinnig goede singles dan als een conceptalbum. Het feit dat er na elk nummer netjes een stilte zit versterkt dit beeld nog meer. :-/

Is dit dan negatief? Zeker niet. Elk nummer is zo waanzinnig goed en strak geproduceerd, dat er eigenlijk alleen maar hoogtepunten op het album staan. Dit gaat wel wat ten koste van de dynamiek. Maar ja, kan je een band ervan beschuldigen dat ze elk nummer proberen zo goed mogelijk te maken? 🙂

Samengevat: met The Unforgiving heeft Within Temptation weer een geweldige plaat gemaakt. Ik vermoed wel dat door de gemakkelijk toegankelijke melodieën de houdbaarheidsdatum wat minder lang zal zijn dan voorganger The Heart Of Everything, die mijns inziens wat meer tijd nodig had om als zijn geheimen prijs te geven.

[xrr rating=4/5]

Posted in Music, Reviews | 1 Comment

The Cloak Live

Prog in Amersfoort...

Amersfoortse prog...

29 januari, Café De Noot, Amersfoort

Soms lees je de “Amersfoort.nu” krant wel eens. Mijn oog viel op een aankondiging van een band genaamd The Cloak, met daarbij de vermelding dat het hier om een viertal gaat dat symfonische rock met goth en klassieke invloeden gaat. Dan gaan bij mij de oren natuurlijk gelijk overeind staan. 🙂

Nu is Café de Noot slechts een fietstochtje door het Schothorster park van mijn huis vandaan, dus dacht ik om half tien: laat ik eens gaan kijken wat die jongens zoal maken!

Nou ja, jongens in de overdrachtelijke zin dan: de band wordt gesierd door frontvrouw Carmen Pierik. Een vriendelijke hoofdknik was mijn deel toen ik met een Palmpje naar het podiumgedeelte van het café liep, waar intussen ongeveer 30 mensen waren gearriveerd. Ik vermoed dat het merendeel familie of vrienden zijn.

Maar moet het daar bij blijven? Wat mij betreft niet, want The Cloak maakt uitstekende progrock in de trant van IQ, de soft kant van bv Within Temptation, een beetje Asgard (voor de liefhebbers: jaja!!!!), en zelfs een beetje Arrakeen! Dat laatste komt omdat Carmen ook een aantal nummer in het Frans zingt. Maar daar blijft het niet bij, want wat zeker redelijk uniek is voor een band in dit genre: tijdens dit concert heb ik zowel Engels, Duits, Frans als Latijn voorbij horen komen. Hiermee kan de The Cloak zich zeker onderscheiden van de grijze middenmoot, want er zijn meer dan genoeg bands in het neoprog genre.

Gelukkig is dat niet alles, want met name toetsenist en chief composer Dik Hazeleger laat zeer gevarieerde en melodieuze structuren horen. De nummers die ik gehoord heb (moest helaas na de 2e set weg) zijn ook zonder uitzondering echt af.

Bij het concert was een boekje beschikbaar waarin het basisverhaal van elk nummer beschreven stond. Elk verhaal was een sprookje of een volksmythe uit een bepaalde cultuur. Erg leuk want zo zit je gelijk lekker in de nummers! 😀

Al met al een zeer prettige verassing, deze band, zulke mooie muziek zo dicht bij huis! Even aan de jongens in De Boerderij in Zoetermeer: doe deze band eens even snel boeken voor het volgende Progfestival! Daar krijgen jullie zeker geen spijt van!

[xrr rating=4/5]

Posted in Concerts | 2,696 Comments