Expand my Community achievements bar.

Learn about Edge Delivery Services in upcoming GEM session
SOLVED

How to use #onChange in ResourceChangeListener

Avatar

Level 7

Hi

I would like to know if and why do I need the NotNull Constraint when implementing onChange in ResourceChangeListener. Here is the code:

 

public class ComponentCampaignCleanupListener implements ResourceChangeListener {

private static final Logger logger = LoggerFactory.getLogger(ComponentCampaignCleanupListener.class);

@Reference
private ResourceResolverService resourceResolverService;


@Override
public void onChange(List<ResourceChange> list) {...} //**Do I need here @NotNull for the list parameter and why?
1 Accepted Solution

Avatar

Correct answer by
Community Advisor

I have tried both ways. It is working fine for me

    @Override
    public void onChange(List<ResourceChange> changes) {
        logger.info("On Change Event !!!");
        changes.forEach(change -> {
            logger.info("Resource event: {} at: {}", change.getType(), change.getPath());
        });

    }
    @Override
    public void onChange(@NotNull List<ResourceChange> changes) {
        logger.info("On Change Event !!!");
        changes.forEach(change -> {
            logger.info("Resource event: {} at: {}", change.getType(), change.getPath());
        });

    }

 

 


Aanchal Sikka

View solution in original post

4 Replies

Avatar

Level 7

I dont think it is mandatory to define notnull here. Refer below 

https://github.com/apache/sling-org-apache-sling-discovery-commons/blob/4f7d7ca3224239d52798cc8418ec... 

 

The @notnull Annotation is, actually, an explicit contract declaring the following:

  1. A method should not return null.
  2. A variable (like fields, local variables, and parameters) cannot should not hold null value.

Additionally, @notnull is often checked by ConstraintValidators (eg. in spring and hibernate).

The @notnull annotation doesn't do any validation on its own because the annotation definition does not provide any ConstraintValidator type reference.

Avatar

Level 7

Thanks @tusharbias 

In my specific case the list variable could be null. I am listening to /content ADDED changes. In fact, if I add the @NotNull constraint AEM I cannot render any Page and get a compilation error.

The reason why I posted the question is that I thought according to the interface, this method should have a @NotNull annotation.

 

Here is the interface:

@ConsumerType
public interface ResourceChangeListener {
String PATHS = "resource.paths";
String CHANGES = "resource.change.types";
String PROPERTY_NAMES_HINT = "resource.property.names.hint";

void onChange(@NotNull List<ResourceChange> var1);
}

Avatar

Correct answer by
Community Advisor

I have tried both ways. It is working fine for me

    @Override
    public void onChange(List<ResourceChange> changes) {
        logger.info("On Change Event !!!");
        changes.forEach(change -> {
            logger.info("Resource event: {} at: {}", change.getType(), change.getPath());
        });

    }
    @Override
    public void onChange(@NotNull List<ResourceChange> changes) {
        logger.info("On Change Event !!!");
        changes.forEach(change -> {
            logger.info("Resource event: {} at: {}", change.getType(), change.getPath());
        });

    }

 

 


Aanchal Sikka

Avatar

Community Advisor

Hi @anasustic ,

If you want to use Javax validation constraints to ensure that the List<ResourceChange> list

 being passed in is not null then @NotNull annotation is being used.

Fore more details please visit: https://docs.oracle.com/javaee/7/api/javax/validation/constraints/NotNull.html

Hope that helps!

Regards,

Santosh