{"id":6195,"date":"2023-03-24T14:10:20","date_gmt":"2023-03-24T13:10:20","guid":{"rendered":"https:\/\/kabisa.nl\/?p=6195"},"modified":"2023-11-14T09:26:29","modified_gmt":"2023-11-14T08:26:29","slug":"using-jackson-builders-in-spring-boot-native","status":"publish","type":"post","link":"https:\/\/kabisa.nl\/en\/tech\/using-jackson-builders-in-spring-boot-native\/","title":{"rendered":"Using Jackson builders in Spring Boot Native"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"6195\" class=\"elementor elementor-6195\" data-elementor-post-type=\"post\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-37b84c5 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"37b84c5\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;jet_parallax_layout_list&quot;:[]}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-13b1af5\" data-id=\"13b1af5\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-17ca76b elementor-widget elementor-widget-text-editor\" data-id=\"17ca76b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>When you\u2019ve read a few of my earlier blog posts, you know that I cherish a secret love for the builder pattern used to create immutable objects. My default implementation includes the Jackson library for (de)serialization of this pattern, and Lombok for providing the perfect glue with almost no boilerplate code.<\/p><p>When you\u2019ve not read any of my earlier posts (yes, shame on you) here is the link:\u00a0<a href=\"https:\/\/archive.kabisa.nl\/tech\/using-jackson-builders-in-spring-boot-native\/what-i-love-about-lombok-and-the-builder-pattern\/\">What I love about Lombok and the builder pattern<\/a><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-ed5da16 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"ed5da16\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;jet_parallax_layout_list&quot;:[]}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-d93f084\" data-id=\"d93f084\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-fdda8df elementor-widget elementor-widget-text-editor\" data-id=\"fdda8df\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h2 id=\"shortcut\">Shortcut<\/h2><p>Only interested in the code? Look at the final\u00a0<a href=\"https:\/\/gist.github.com\/VR4J\/0b30b2d04f95ab37d867353ebcda3e81\">gist<\/a>.<\/p><h2 id=\"whats-the-problem\">What\u2019s the problem?<\/h2><p>When using the builder pattern with Jackson in a regular Java Virtual Machine (JVM) environment, everything is fine, everything works fine because it allows for reflection during runtime.<\/p><p>When using native compilation, which was recently released in Spring Boot 3 (<a href=\"https:\/\/spring.io\/blog\/2022\/09\/26\/native-support-in-spring-boot-3-0-0-m5\">link<\/a>), you cannot rely on this reflection during runtime and need to configure it upfront during build time.<\/p><p>When you do not configure anything during build time, you will run into a RuntimeException that looks something like this.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b547069 elementor-widget elementor-widget-code-highlight\" data-id=\"b547069\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-java line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-java\">\n\t\t\t\t\t<xmp>com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Builder class nl.vreijsenj.blog.Movie$Builder does not have build method (name: 'build')\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-406363c elementor-widget elementor-widget-text-editor\" data-id=\"406363c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h2 id=\"native-configuration\">Native Configuration<\/h2><p>Spring Boot 3 allows for what\u2019s called \u201cnative hints\u201d to be declared, which are used during build time. These Native Hints allow you to specify classes or methods that should be accessible using reflection, or specify resources that would normally be excluded by the native build but are actually needed for a specific use-case.<\/p><p>Spring Boot\u2019s way of specifying these native hints is by implementing the\u00a0<a href=\"https:\/\/docs.spring.io\/spring-framework\/docs\/6.0.0\/reference\/html\/core.html#aot-hints\">RuntimeHints<\/a>\u00a0API.<\/p><h2 id=\"identifying-jackson-builders\">Identifying Jackson Builders<\/h2><p>We first need to be able to identify the builder classes that we need to configure reflection for.<\/p><p>As you know, Lombok\u2019s\u00a0<code>@Jacksonized<\/code>\u00a0annotation will put Jackson\u2019s\u00a0<code>@JsonPOJOBuilder<\/code>\u00a0annotations on the builder class which we can use to identify our builder classes.<\/p><p>Let\u2019s see how that would look;<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ab408eb elementor-widget elementor-widget-code-highlight\" data-id=\"ab408eb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-java line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-java\">\n\t\t\t\t\t<xmp>List<TypeReference> builders = getClasses(loader, ROOT_PACKAGE).stream()\n    .filter(clazz -> clazz.getAnnotationsByType(JsonPOJOBuilder.class).length > 0)\n    .map(TypeReference::of)\n    .toList();<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-bec05e0 elementor-widget elementor-widget-text-editor\" data-id=\"bec05e0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>We then have to instruct the native compilation process to allow invocation of the declared constructor and public methods, think about the build method from our error message.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4153084 elementor-widget elementor-widget-code-highlight\" data-id=\"4153084\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-java line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-java\">\n\t\t\t\t\t<xmp>hints\n    .reflection()\n    .registerTypes(builders, TypeHint.builtWith(MemberCategory.INVOKE_DECLARED_CONSTRUCTORS, MemberCategory.INVOKE_PUBLIC_METHODS))\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-fec5222 elementor-widget elementor-widget-text-editor\" data-id=\"fec5222\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h2 id=\"completing-the-puzzle\">Completing the puzzle<\/h2><p>When we put the above into our own implementation of a\u00a0<code>RuntimeHintsRegistrar<\/code>\u00a0we get the following class:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0eb56aa elementor-widget elementor-widget-code-highlight\" data-id=\"0eb56aa\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-java line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-java\">\n\t\t\t\t\t<xmp>@Configuration\n@ImportRuntimeHints(JacksonHints.class)\npublic class JacksonHints implements RuntimeHintsRegistrar {\n\n    private static final String ROOT_PACKAGE = \"nl.vreijsenj.streaming\";\n    private static final String PACKAGE_SEPARATOR = \".\";\n    private static final String FOLDER_SEPARATOR = \"\/\";\n\n    @Override\n    public void registerHints(RuntimeHints hints, ClassLoader loader) {\n        List<TypeReference> builders = getClasses(loader, ROOT_PACKAGE).stream()\n            .filter(clazz -> clazz.getAnnotationsByType(JsonPOJOBuilder.class).length > 0)\n            .map(TypeReference::of)\n            .toList();\n\n        hints\n            .reflection()\n            .registerTypes(builders, TypeHint.builtWith(MemberCategory.INVOKE_DECLARED_CONSTRUCTORS, MemberCategory.INVOKE_PUBLIC_METHODS))\n    }\n\n    public Set<Class<?>> getClasses(ClassLoader loader, String name) {\n        InputStream stream = loader.getResourceAsStream(\n                name.replaceAll(\"[\" + PACKAGE_SEPARATOR + \"]\", FOLDER_SEPARATOR)\n        );\n\n        BufferedReader reader = new BufferedReader(new InputStreamReader(stream));\n        List<String> lines = reader.lines().toList();\n\n        Stream<Class<?>> current = lines.stream()\n            .filter(this::isClassFile)\n            .map(line -> getClass(line, name));\n\n        Stream<Class<?>> nested = lines.stream()\n            .filter(this::isPackageFolder)\n            .map(String::trim)\n            .map(child -> setChildPackageName(name, child))\n            .map(pName -> getClasses(loader, pName))\n            .flatMap(Set::stream);\n\n        return Stream.concat(current, nested).collect(Collectors.toSet());\n    }\n\n    @SneakyThrows\n    private Class<?> getClass(String className, String packageName) {\n        return Class.forName(packageName + PACKAGE_SEPARATOR + className.substring(0, className.lastIndexOf(PACKAGE_SEPARATOR)));\n    }\n\n    private boolean isClassFile(String path) {\n        return path.endsWith(\".class\");\n    }\n\n    private boolean isPackageFolder(String path) {\n        return ! isClassFile(path);\n    }\n\n    private String setChildPackageName(String parent, String child) {\n        return parent + PACKAGE_SEPARATOR + child;\n    }\n}\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ad2751d elementor-widget elementor-widget-text-editor\" data-id=\"ad2751d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h2 id=\"summary\">Summary<\/h2><p>Well, there you have it, a class ready to be included in any Spring Boot 3 application. Rather prefer a gist? Way ahead of you\u00a0<a href=\"https:\/\/gist.github.com\/VR4J\/0b30b2d04f95ab37d867353ebcda3e81\">here is the gist<\/a>.<\/p><p>That\u2019s all folks! \ud83d\udc4b<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>When you\u2019ve read a few of my earlier blog posts, you know that I cherish a secret love for the builder pattern used to create immutable objects. My default implementation includes the Jackson library for (de)serialization of this pattern, and Lombok for providing the perfect glue with almost no boilerplate code. When you\u2019ve not read [&hellip;]<\/p>\n","protected":false},"author":18,"featured_media":3831,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[149],"tags":[],"class_list":["post-6195","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tech"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v28.4 (Yoast SEO v28.5) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Using Jackson builders in Spring Boot Native | Kabisa Software Artisans<\/title>\n<meta name=\"description\" content=\"When you\u2019ve read a few of my earlier blog posts, you know that I cherish a secret love for the builder pattern used to create immutable objects. My\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kabisa.nl\/en\/tech\/using-jackson-builders-in-spring-boot-native\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Using Jackson builders in Spring Boot Native | Kabisa Software Artisans\" \/>\n<meta property=\"og:description\" content=\"When you\u2019ve read a few of my earlier blog posts, you know that I cherish a secret love for the builder pattern used to create immutable objects. My\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kabisa.nl\/en\/tech\/using-jackson-builders-in-spring-boot-native\/\" \/>\n<meta property=\"og:site_name\" content=\"Kabisa Software Artisans\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kabisaict\" \/>\n<meta property=\"article:published_time\" content=\"2023-03-24T13:10:20+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-11-14T08:26:29+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kabisa.nl\/wp-content\/uploads\/2023\/08\/Foto-Joery.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"1069\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Joery Vreijsen\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Joery Vreijsen\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Using Jackson builders in Spring Boot Native | Kabisa Software Artisans","description":"When you\u2019ve read a few of my earlier blog posts, you know that I cherish a secret love for the builder pattern used to create immutable objects. My","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kabisa.nl\/en\/tech\/using-jackson-builders-in-spring-boot-native\/","og_locale":"en_US","og_type":"article","og_title":"Using Jackson builders in Spring Boot Native | Kabisa Software Artisans","og_description":"When you\u2019ve read a few of my earlier blog posts, you know that I cherish a secret love for the builder pattern used to create immutable objects. My","og_url":"https:\/\/kabisa.nl\/en\/tech\/using-jackson-builders-in-spring-boot-native\/","og_site_name":"Kabisa Software Artisans","article_publisher":"https:\/\/www.facebook.com\/kabisaict","article_published_time":"2023-03-24T13:10:20+00:00","article_modified_time":"2023-11-14T08:26:29+00:00","og_image":[{"width":1920,"height":1069,"url":"https:\/\/kabisa.nl\/wp-content\/uploads\/2023\/08\/Foto-Joery.jpg","type":"image\/jpeg"}],"author":"Joery Vreijsen","twitter_misc":{"Written by":"Joery Vreijsen","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kabisa.nl\/en\/tech\/using-jackson-builders-in-spring-boot-native\/#article","isPartOf":{"@id":"https:\/\/kabisa.nl\/en\/tech\/using-jackson-builders-in-spring-boot-native\/"},"author":{"name":"Joery Vreijsen","@id":"https:\/\/kabisa.nl\/en\/#\/schema\/person\/3d01a54b19b4bb85caf102f201ae600a"},"headline":"Using Jackson builders in Spring Boot Native","datePublished":"2023-03-24T13:10:20+00:00","dateModified":"2023-11-14T08:26:29+00:00","mainEntityOfPage":{"@id":"https:\/\/kabisa.nl\/en\/tech\/using-jackson-builders-in-spring-boot-native\/"},"wordCount":382,"commentCount":0,"publisher":{"@id":"https:\/\/kabisa.nl\/en\/#organization"},"image":{"@id":"https:\/\/kabisa.nl\/en\/tech\/using-jackson-builders-in-spring-boot-native\/#primaryimage"},"thumbnailUrl":"https:\/\/kabisa.nl\/wp-content\/uploads\/2023\/08\/Foto-Joery.jpg","articleSection":["Tech blog"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kabisa.nl\/en\/tech\/using-jackson-builders-in-spring-boot-native\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kabisa.nl\/en\/tech\/using-jackson-builders-in-spring-boot-native\/","url":"https:\/\/kabisa.nl\/en\/tech\/using-jackson-builders-in-spring-boot-native\/","name":"Using Jackson builders in Spring Boot Native | Kabisa Software Artisans","isPartOf":{"@id":"https:\/\/kabisa.nl\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kabisa.nl\/en\/tech\/using-jackson-builders-in-spring-boot-native\/#primaryimage"},"image":{"@id":"https:\/\/kabisa.nl\/en\/tech\/using-jackson-builders-in-spring-boot-native\/#primaryimage"},"thumbnailUrl":"https:\/\/kabisa.nl\/wp-content\/uploads\/2023\/08\/Foto-Joery.jpg","datePublished":"2023-03-24T13:10:20+00:00","dateModified":"2023-11-14T08:26:29+00:00","description":"When you\u2019ve read a few of my earlier blog posts, you know that I cherish a secret love for the builder pattern used to create immutable objects. My","breadcrumb":{"@id":"https:\/\/kabisa.nl\/en\/tech\/using-jackson-builders-in-spring-boot-native\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kabisa.nl\/en\/tech\/using-jackson-builders-in-spring-boot-native\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/kabisa.nl\/en\/tech\/using-jackson-builders-in-spring-boot-native\/#primaryimage","url":"https:\/\/kabisa.nl\/wp-content\/uploads\/2023\/08\/Foto-Joery.jpg","contentUrl":"https:\/\/kabisa.nl\/wp-content\/uploads\/2023\/08\/Foto-Joery.jpg","width":1920,"height":1069,"caption":"foto Joery Java Developer"},{"@type":"BreadcrumbList","@id":"https:\/\/kabisa.nl\/en\/tech\/using-jackson-builders-in-spring-boot-native\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kabisa.nl\/en\/"},{"@type":"ListItem","position":2,"name":"Tech blog","item":"https:\/\/kabisa.nl\/en\/tech\/"},{"@type":"ListItem","position":3,"name":"Using Jackson builders in Spring Boot Native"}]},{"@type":"WebSite","@id":"https:\/\/kabisa.nl\/en\/#website","url":"https:\/\/kabisa.nl\/en\/","name":"Kabisa Software Artisans","description":"Mission-critical Software for Hightech, Fintech &amp; E-commerce","publisher":{"@id":"https:\/\/kabisa.nl\/en\/#organization"},"alternateName":"Kabisa","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kabisa.nl\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/kabisa.nl\/en\/#organization","name":"Cloud Legends","alternateName":"Kabisa","url":"https:\/\/kabisa.nl\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/kabisa.nl\/en\/#\/schema\/logo\/image\/","url":"https:\/\/kabisa.nl\/wp-content\/uploads\/2022\/12\/kabisa-favicon.png","contentUrl":"https:\/\/kabisa.nl\/wp-content\/uploads\/2022\/12\/kabisa-favicon.png","width":512,"height":512,"caption":"Cloud Legends"},"image":{"@id":"https:\/\/kabisa.nl\/en\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kabisaict","https:\/\/x.com\/kabisasoftware"],"description":"Software Development is onze core-business. Kabisa ontwikkelt innovatieve maatwerk software die naadloos aansluit bij de behoeftes van klanten en eindgebruikers. Dat doen we in nauwe samenwerking in elke fase van het proces: co-creatie noemen we dat.","email":"info@kabisa.nl","telephone":"0495 430 798","legalName":"Kabisa B.V.","foundingDate":"2006-01-01","numberOfEmployees":{"@type":"QuantitativeValue","minValue":"51","maxValue":"200"}},{"@type":"Person","@id":"https:\/\/kabisa.nl\/en\/#\/schema\/person\/3d01a54b19b4bb85caf102f201ae600a","name":"Joery Vreijsen","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/a7fd899168ff4d848ffd6f23a537957c9f47914239de9482363b0b2d45b4af2f?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/a7fd899168ff4d848ffd6f23a537957c9f47914239de9482363b0b2d45b4af2f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a7fd899168ff4d848ffd6f23a537957c9f47914239de9482363b0b2d45b4af2f?s=96&d=mm&r=g","caption":"Joery Vreijsen"}}]}},"_links":{"self":[{"href":"https:\/\/kabisa.nl\/en\/wp-json\/wp\/v2\/posts\/6195","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kabisa.nl\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kabisa.nl\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kabisa.nl\/en\/wp-json\/wp\/v2\/users\/18"}],"replies":[{"embeddable":true,"href":"https:\/\/kabisa.nl\/en\/wp-json\/wp\/v2\/comments?post=6195"}],"version-history":[{"count":4,"href":"https:\/\/kabisa.nl\/en\/wp-json\/wp\/v2\/posts\/6195\/revisions"}],"predecessor-version":[{"id":6199,"href":"https:\/\/kabisa.nl\/en\/wp-json\/wp\/v2\/posts\/6195\/revisions\/6199"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kabisa.nl\/en\/wp-json\/wp\/v2\/media\/3831"}],"wp:attachment":[{"href":"https:\/\/kabisa.nl\/en\/wp-json\/wp\/v2\/media?parent=6195"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/kabisa.nl\/en\/wp-json\/wp\/v2\/categories?post=6195"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kabisa.nl\/en\/wp-json\/wp\/v2\/tags?post=6195"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}