Resolving links to content items - kontent-ai/java-packages GitHub Wiki

Resolving links to content items

Content links

Rich text elements in Kontent.ai can contain links to other content items. For example, if you run a blog, these content item links might represent hyperlinks to other blog posts or your contact page.

Without adjusting your project, any link in a Rich text element that points to a content item will contain an empty value.

<p>
  Each AeroPress comes with a
  <a href="" data-item-id="65832c4e-8e9c-445f-a001-b9528d13dac8"
    >pack of filters</a
  >
  included in the box.
</p>

To make sure such links resolve correctly on your website, you need to complete these steps:

  1. Implement a content link URL resolver
  2. Implement a broken link URL resolver
  3. Register the resolvers within the DeliveryClient instance
  4. Retrieve content of a Rich text element

Implementing a resolver

Your content link URL resolver must implement the ContentLinkUrlResolver interface, which is a functional interface for resolving URLs to content items, with a String resolveLinkUrl(Link link) method.

Your broken link URL resolver must implement the BrokenLinkUrlResolver interface, which is a functional interface for resolving URLs to missing content items, with a String resolveBrokenLinkUrl() method.

  • ContentLinkUrlResolver – used when the linked content item is available.
  • BrokenLinkUrlResolver – used when the linked content item is not available.

When are content items available?

  • For live environment, a content item is available when published, and unavailable when deleted or unpublished.
  • For preview environment, a content item is available when it exists in the project inventory, and unavailable when deleted.
// Sample resolver implementation
public class CustomContentLinkUrlResolver implements ContentLinkUrlResolver {

    @Override
    String resolveLinkUrl(Link link) {
        // Resolves URLs to content items based on the 'accessory' content type
        if ("accessory".equals(link.getCodename())) {
            return String.format("/accessories/%s", link.getUrlSlug());
        }
    }
}

public class CustomBrokenContentLinkUrlResolver implements BrokenLinkUrlResolver {

    @Override
    String resolveBrokenLinkUrl() {
        // Resolves URLs to unavailable content items
        return "/404";
    }
}

Note, because both of these are functional interfaces, you can also implement these as lambdas, see Registering a resolver for examples.

When building the resolver logic, you can use the link argument in your code.

The link argument provides the following information about the linked content item:

Method Description Example
getCodename() The codename of the linked content item. aeropress_filters
getUrlSlug() The URL slug of the linked content item. The value is null if the item's content type doesn't have a URL slug element in its definition. aeropress-filters
getType() The codename of the content type of the linked content item. accessory

Registering a resolver

Once you implement the resolver, you need to register it in the DeliveryClient.

// Sets the resolver as an optional dependency of the DeliveryClient
DeliveryClient client = new DeliveryClient("975bf280-fd91-488c-994c-2f04416e5ee3");
client.setContentLinkUrlResolver(new CustomContentLinkUrlResolver());
client.setBrokenLinkUrlResolver(new CustomBrokenContentLinkUrlResolver());

You can also register lambdas with the DeliveryClient as the resolvers are functional interfaces.

DeliveryClient client = new DeliveryClient("975bf280-fd91-488c-994c-2f04416e5ee3");
client.setContentLinkUrlResolver((link) -> {
    if ("accessory".equals(link.getCodename())) {
        return String.format("/accessories/%s", link.getUrlSlug());
    }
});
client.setBrokenLinkUrlResolver(() -> "/404");

Retrieving Rich text content

Now, you can resolve links in Rich text elements by using the getString() method on the ContentItem object.

// Retrieves the 'aeropress' content item
ContentItemResponse response = client.getItem("aeropress");
ContentItem item = response.getItem();

// Retrieves text from the 'long_description' Rich text element
String description = item.getString("long_description");

The URL to the content item in the text is now correctly resolved.

<p>
  Each AeroPress comes with a
  <a
    href="/accessories/aeropress-filters"
    data-item-id="65832c4e-8e9c-445f-a001-b9528d13dac8"
    >pack of filters</a
  >
  included in the box.
</p>
⚠️ **GitHub.com Fallback** ⚠️