It is still used for many things that cannot be annotated. For example. JSF custom check messages:
<application> <message-bundle>com.example.i18n.messages</message-bundle> </application>
The i18n global package (so you do not need to declare <f:loadBundle> in each view):
<application> <resource-bundle> <base-name>com.example.i18n.Text</base-name> <var>text</var> </resource-bundle> </application>
Explicitly supported i18n locales (so those that are not declared will be ignored, although there is a message package or resource package for it):
<application> <locale-config> <default-locale>en</default-locale> <supported-locale>nl</supported-locale> <supported-locale>es</supported-locale> <supported-locale>de</supported-locale> </locale-config> </application>
Custom widget handlers :
<application> <view-handler>com.example.SomeViewHandler</view-handler> </application>
Phase listeners (there is no annotation for this yet):
<lifecycle> <phase-listener>com.example.SomePhaseListener</phase-listener> </lifecycle>
Managed beans that cannot be annotated (below is the current Date at #{now} ):
<managed-bean> <description>Current date and time</description> <managed-bean-name>now</managed-bean-name> <managed-bean-class>java.util.Date</managed-bean-class> <managed-bean-scope>request</managed-bean-scope> </managed-bean>
Custom factories, such as a custom factory exception handler (it also allows FacesContext , ExternalContext , LifeCycle and much more so you can provide your own implementation):
<factory> <exception-handler-factory>com.example.SomeExceptionHandlerFactory</exception-handler-factory> </factory>
Call only ordinary. If your IDE has a faces-config.xml autocomplete tag, you can find it all. Only managed beans, validators, converters, components, renderers, and point-to-point applications are no longer needed thanks to new annotations and implicit navigation.