开发者

Velocity Eventhandler

开发者 https://www.devze.com 2023-04-10 20:08 出处:网络
in velocity, when you do $object.variable if it not be able to find the getter function to access itor the getter returns a null. it will just show $object.variable explici开发者_开发技巧tly on the

in velocity, when you do $object.variable if it not be able to find the getter function to access it or the getter returns a null. it will just show $object.variable explici开发者_开发技巧tly on the page

I know there is a quiet reference, but I don't want to add ! sign to thousands of variables.

I have tried InvalidReferenceEventHandler, NullValueHandler they all didn't get called.

I wander is there a specific type of Eventhandler for this.

Many thanks


The above seems to be a valid choice as well. However here is another option:

public class AppSpecificInvalidReferenceEventHandler implements 
                                                     InvalidReferenceEventHandler
{

  private static final Logger LOGGER = 
     Logger.getLogger(AppSpecificInvalidReferenceEventHandler.class);

  @Override
  public Object invalidGetMethod(Context context, String reference, 
                                 Object object, String property, Info info)
  {
    reportInvalidReference(reference, info);
    return "";
  }

  @Override
  public boolean invalidSetMethod(Context context, String leftreference, 
                                  String rightreference, Info info)
  {
    reportInvalidReference(leftreference, info);
    return false;
  }

  @Override
  public Object invalidMethod(Context context, String reference, Object object, 
                              String method, Info info)
  {
    if (reference == null) {
      reportInvalidReference(object.getClass().getName() + "." + method, info);
    } else {
      reportInvalidReference(reference, info);
    }
    return "";
  }

  private void reportInvalidReference(String reference, Info info)
  {
    LOGGER.info("REFRERENCE: " + reference + " Info <" + info + ">");
  }
}

You'll also need to add the following to your velocity.properties file:

eventhandler.invalidreferences.class=path.to.package.AppSpecificInvalidReferenceEventHandler,org.apache.velocity.app.event.implement.ReportInvalidReferences

You might be surprised at the results though, so it will likely need fine-tuning dependent upon your needs.


I'm basing this off of Engine-1.7 code.

It seems that when an invalid method is called that the utility method EventHandlerUtil.invalidGetMethod is called. This method creates a new InvalidGetMethodExecutor (this is an inner class on InvalidReferenceEventHandler). Eventually this chains down into a call to invalidReferenceHandlerCall which eventually iterates over any handlerIterators which have been defined. Unfortunately I don't know enough about the internals of Velocity to tell you how to inject these values though. My guess is that the user list will suggest a way to override this behavior or a suggestion will be to use / implement a custom tool.

Edit:

According to the Developer Guide you can do the following. You'll need to write some code to deal with it, but it shouldn't be too difficult:

Pluggable Introspection

runtime.introspector.uberspect = org.apache.velocity.util.introspection.UberspectImpl

This property sets the 'Uberspector', the introspection package that handles all introspection strategies for Velocity. You can specify a comma-separated list of Uberspector classes, in which case all Uberspectors are chained. The default chaining behaviour is to return the first non-null value for each introspection call among all provided uberspectors. You can modify this behaviour (for instance to restrict access to some methods) by subclassing org.apache.velocity.util.introspection.AbstractChainableUberspector (or implementing directly org.apache.velocity.util.introspection.ChainableUberspector). This allows you to create more interesting rules or patterns for Uberspection, rather than just returning the first non-null value.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号