Instead of creating a custom validator in the traditional sense I’m relying on JSR-303 annotations to specify validation constraints, because, it is the future, and I shouldn’t have to do a load of coding to specify common validation requirements like an email address regular expression or a numeric value that is required to be within a defined range.
Using Spring web flow, I found that binding error messages weren’t available when I called “<@spring.showErrors ‘<br/>’/>” in my freemarker view (after I had bound the field I wanted to show errors for of course).
So where are my error messages?
It turns out that Spring Web Flow has a different way of providing the user with feedback messages. The Spring Web Flow reference documentation says: “Spring Web Flow’s MessageContext is an API for recording messages during the course of flow executions”.
The message context (with all your binding error messages in it) can be found here: flowRequestContext.messageContext. I’ve written a couple of macros to make retrieving error messages from this object a little easier:
<#--
* Shows flow messages (which reside in flowRequestContext.messageContext)
*
* @param source Name of the field that caused the error
* @param severity String representation of org.springframework.binding.message.Severity
* @param separator the html tag or other character list that should be used to
* separate each option. Typically '<br>'.
* @param classOrStyle either the name of a CSS class element (which is defined in
* the template or an external CSS file) or an inline style. If the value passed in here
* contains a colon (:) then a 'style=' attribute will be used, else a 'class=' attribute
* will be used.
* @param tag The HTML tag to wrap the error in
-->
<#macro showFlowMessages source severity separator classOrStyle="" tag="">
<#assign messages = flowRequestContext.messageContext.getMessagesBySource(source)/>
<#if (messages?size > 0)>
<#list messages as message>
<#if message.severity?string == severity>
<#if classOrStyle == "" && tag == "">
${message.getText()}
<#else>
<#if classOrStyle == "">
<${tag}>${message.getText()}</${tag}>
<#else>
<#if tag == ""><#local tag = "span" /></#if>
<#if classOrStyle?index_of(":") == -1><#local attr="class"><#else><#local attr="style"></#if>
<${tag} ${attr}="${classOrStyle}">${message.getText()}</${tag}>
</#if>
</#if>
<#if message_has_next>${separator}</#if>
</#if>
</#list>
</#if>
</#macro>
<#--
* Shows flow messages (which reside in flowRequestContext.messageContext) in an ordered or unordered list
*
* @param source Name of the field that caused the error
* @param severity String representation of org.springframework.binding.message.Severity
* @param classOrStyle either the name of a CSS class element (which is defined in
* the template or an external CSS file) or an inline style. If the value passed in here
* contains a colon (:) then a 'style=' attribute will be used, else a 'class=' attribute
* will be used.
* @param ordered Whether or not the macro should output the list as an <ol> or <ul>
-->
<#macro showFlowMessagesList source severity classOrStyle="" ordered=false>
<#local errorsList><@showFlowMessages source, severity, "", "", "li" /></#local>
<#if errorsList?trim != "">
<#if classOrStyle == "">
<#local attr="">
<#elseif classOrStyle?index_of(":") == -1>
<#local attr=" class=" + classOrStyle>
<#else>
<#local attr=" style=" + classOrStyle>
</#if>
<#if ordered><ol${attr}><#else><ul${attr}></#if>
${errorsList}
<#if ordered></ol><#else></ul></#if>
</#if>
</#macro>
I’ve added these to my spring extensions, which you can download here: springx.ftl
wethenorth darknet url https://sites.google.com/view/nexusdarknetmarket
torzon market url https://sites.google.com/view/nexus-market-link
капельница от запоя недорого капельница от запоя недорого
888 888 .
ares market url https://sites.google.com/view/nexusdarknetlink
cannaexpress market url https://sites.google.com/view/nexusdarknetmarket
888starz تسجيل الدخول مراهنات 888starz تسجيل الدخول مراهنات.
888starz kz https://888starz-uz1.org/ .
cocorico onion https://sites.google.com/view/nexusmarketdarknet
torzon market https://sites.google.com/view/nexusdarknetlink
автоматические рулонные шторы с электроприводом на окна автоматические рулонные шторы с электроприводом на окна
darknet drug market https://sites.google.com/view/nexusmarketdarknet
капельница от алкоголя цена капельница от алкоголя цена
капельница от похмелья цена капельница от похмелья цена
nexus darknet market access https://sites.google.com/view/nexusdarknetlink
1xbet güncel adres 1xbet güncel adres
xbet xbet
tordex onion https://sites.google.com/view/nexusmarketdarknet
birxbet giriş birxbet giriş
silk road market link https://sites.google.com/view/nexusdarknetlink
darknet market links https://sites.google.com/view/nexusdarknetmarket
1xbet giriş linki 1xbet giriş linki
nexus url https://sites.google.com/view/nexusmarketplace
dark matter market darknet https://sites.google.com/view/nexusdarknetmarket
роликовые шторы роликовые шторы
abacus darknet market https://sites.google.com/view/nexusmarketplace
cannaexpress url https://sites.google.com/view/nexusdarknetmarket
рулонная штора на заказ цена https://avtomaticheskie-rulonnye-shtory5.ru
darkmarket 2026 https://sites.google.com/view/nexusmarketdarknet
drughub darknet market https://sites.google.com/view/nexusmarketplace
cocorico darknet url https://sites.google.com/view/nexusdarknetlink
888starz deposit http://www.888starz-uz3.org .
Покупка автомобилей ПМР https://www.pmr-auto.ru .
drughub darknet url https://sites.google.com/view/nexusmarketdarknet
darknet market https://sites.google.com/view/nexusdarknetlink
двойные рулонные шторы с электроприводом двойные рулонные шторы с электроприводом
рулонные шторы купить в москве рулонные шторы купить в москве
nexus onion mirror https://sites.google.com/view/nexusmarketplace
tordex darknet link https://sites.google.com/view/nexusdarknetlink
silk road onion https://sites.google.com/view/nexusmarketplace
cocorico market link https://sites.google.com/view/nexus-market-url
888starz bet https://888starz-egypt5.com/
ares shop https://sites.google.com/view/nexusdarknetmarket
888starz официальный сайт 888starz официальный сайт .
وكلاء 888starz https://888starz-egypt3.com/
888 https://888stars-uz.com/ .
888starz казино 888starz казино .
888stard https://888starz-egypt6.com/
888 star 888 star .
silk road darknet https://sites.google.com/view/nexusmarketplace