How to use beans instead of static classes in facelets taglibs?

48 Views Asked by At

Is it possible to use methods of spring beans instead of static methods when defining tag-lib functions?

At the moment the application only uses static methods of abstract classes:

<?xml version="1.0" encoding="UTF-8"?>
<facelet-taglib
        xmlns="http://xmlns.jcp.org/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
        http://xmlns.jcp.org/xml/ns/javaee/web-facelettaglibrary_2_2.xsd"
        version="2.2">
    <namespace>http://my/security/facelets/tags</namespace>

    <function>
        <function-name>isRegion</function-name>
        <function-class>my.NovaFaceletsAuthorizeTagUtils</function-class>
        <function-signature>boolean isRegion()</function-signature>
    </function>
1

There are 1 best solutions below

0
meriton On BEST ANSWER

No, but you can delegate to bean methods. For instance, like this:

public static boolean isRegion() {
    getCurrentApplicationContext().getBean(RegionService.class).isRegion();
}

There are various approaches for getting the current ApplicationContext, depending on how you're bootstrapping it, and how many ApplicationContext you have. For an overview of relevant techniques, see:

In simple cases, where the bean is application scoped and doesn't have AOP advice (in particular, no @Transactional), it might be easier to put the bean itself into a static field:

@Component
public class RegionService {
    private static RegionService instance;

    public RegionService() {
        instance = this;
    }

    public static RegionService getInstance() {
        return instance;
    }
}

so you can use RegionService.getInstance() to access the bean from anywhere.