{"id":25918132,"url":"https://github.com/alpermulayim/openfoodfacts-spring-boot-starter","last_synced_at":"2026-04-28T16:37:08.478Z","repository":{"id":279972871,"uuid":"935607907","full_name":"AlperMulayim/openfoodfacts-spring-boot-starter","owner":"AlperMulayim","description":"OpenFoodFacts Spring Boot Starter custom webclient and maven package for OpenFoodFacts easy integrations with OpenFoodFacts Rest Api","archived":false,"fork":false,"pushed_at":"2025-02-28T14:08:18.000Z","size":92,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-28T19:48:03.909Z","etag":null,"topics":["api","customspringbootstarter","java","openfoodfacts","openfoodfactsapi","openfoodfactsrestfulapi","openfoodfactsspringbootstarter","restful-api","spring","spring-boot-starter","spring-boot-starter-openfoodfacts","springboot","trending","webclient","webclient-springboot"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/AlperMulayim.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-02-19T18:09:33.000Z","updated_at":"2025-02-28T14:26:30.000Z","dependencies_parsed_at":"2025-02-28T19:48:10.887Z","dependency_job_id":"0cb7a28a-b5fb-49ad-ba01-1502556fd4bb","html_url":"https://github.com/AlperMulayim/openfoodfacts-spring-boot-starter","commit_stats":null,"previous_names":["alpermulayim/openfoodfacts-spring-boot-starter"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlperMulayim%2Fopenfoodfacts-spring-boot-starter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlperMulayim%2Fopenfoodfacts-spring-boot-starter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlperMulayim%2Fopenfoodfacts-spring-boot-starter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlperMulayim%2Fopenfoodfacts-spring-boot-starter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/AlperMulayim","download_url":"https://codeload.github.com/AlperMulayim/openfoodfacts-spring-boot-starter/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241678149,"owners_count":20001682,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","customspringbootstarter","java","openfoodfacts","openfoodfactsapi","openfoodfactsrestfulapi","openfoodfactsspringbootstarter","restful-api","spring","spring-boot-starter","spring-boot-starter-openfoodfacts","springboot","trending","webclient","webclient-springboot"],"created_at":"2025-03-03T14:15:49.951Z","updated_at":"2026-04-28T16:37:08.473Z","avatar_url":"https://github.com/AlperMulayim.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# OpenFoodFacts Spring Boot Starter Maven Package SDK.\n![image](https://github.com/user-attachments/assets/16e7ae4b-8a7b-4f1f-a657-81e5a4c8e9fd)\n\n| Github Page\u003cbr\u003ejavadoc and more |Author\u003cbr\u003eAlper Mulayim | JavaDoc| \n|----------|----------|------------|\n| [![GitHub Pages](https://img.shields.io/badge/GitHub%20Pages-222222?style=for-the-badge\u0026logo=github%20Pages\u0026logoColor=white)](https://alpermulayim.github.io/openfoodfacts-spring-boot-starter/) | [![LinkedIn](https://img.shields.io/badge/LinkedIn-0077B5?style=for-the-badge\u0026logo=linkedin\u0026logoColor=white)](https://www.linkedin.com/in/alpermulayim/) |[JavaDoc](https://alpermulayim.github.io/openfoodfacts-spring-boot-starter/javadocs/com/alpermulayim/openfoodfacts_spring_boot_starter/OpenFoodFactsApi.html) |\n\n\n**openfoodfacts-spring-boot-starter** \u003cbr\u003e Package designed to **simplify the integration of OpenFoodFacts REST APIs into Spring Boot** applications. \u003cbr\u003e Developers can easily connect to the OpenFoodFacts API  without implement any complex RESTful calls.\n\n\n **OpenFoodFactsWebClient**  **OpenFoodFactsApi** current version provides different methods for product and search. \n\n```java\n\nOpenFoodFactsResponse getProduct(String productCode, List\u003cProductField\u003e fields);\nOpenFoodFactsResponse getProduct(String productCode);\nOpenFoodFactsResponse getProduct(ProductRequest request);\nOpenFoodFactsPageResponse searchProduct(ProductSearchRequest request) throws InvocationTargetException, IllegalAccessException , OpenFoodFactsException;\nOpenPriceFactsResponse findPrice(PriceRequest priceRequest);\nOpenPriceFactsResponse findPrice(String productCode);\nOpenPriceLocationsPagedResponse findPriceLocation(PriceLocationRequest locationRequest);\nProductSaveResponse saveProduct(ProductSaveRequest request);\nMono\u003cResponseEntity\u003cString\u003e\u003e uploadProductImage(ProductImageUploadRequest request);\nString uploadProductImageBlocked(ProductImageUploadRequest request) throws OpenFoodFactsException;\nMono\u003cResponseEntity\u003cString\u003e\u003e uploadProductImageUnblocked(ProductImageUploadRequest request) throws OpenFoodFactsException;\n\n```\n\n# Installation How To Use\n\n## Local Installation\n\n**Clone or fork** the repository. \n\n**cd openfoodfacts-springboot-starter**\n\n**mvn clean install** \n\ncheck the repositories added.  **cd ~/.m2** \n\nAdd **openfoodfacts-springboot-starter** dependency  to your spring boot **pom.xml**\n\n```java\n\u003cdependency\u003e\n\t\u003cgroupId\u003eorg.openfoodfacts\u003c/groupId\u003e\n\t\u003cartifactId\u003eopenfoodfacts-spring-boot-starter\u003c/artifactId\u003e\n\t\u003cversion\u003e0.0.1\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n## Installation Online Latest Github  Package\n\n**Note:** Latest package is deployed to [https://github.com/AlperMulayim/openfoodfacts-spring-boot-starter/packages/](https://github.com/AlperMulayim/openfoodfacts-spring-boot-starter/packages/)  Please check the latest version. \n\n**Add github repositories to pom.xml** \n\n```java\n\u003crepositories\u003e\n  \u003crepository\u003e\n    \u003cid\u003egithub\u003c/id\u003e\n    \u003curl\u003ehttps://maven.pkg.github.com/AlperMulayim/openfoodfacts-spring-boot-starter\u003c/url\u003e\n  \u003c/repository\u003e\n\u003c/repositories\u003e\n```\n\n**Add openfoodfacts-spring-boot-starter dependecy to your  pom.xml** \n\n Please check latest version on [https://github.com/AlperMulayim/openfoodfacts-spring-boot-starter/packages/](https://github.com/AlperMulayim/openfoodfacts-spring-boot-starter/packages/)\n\n```java\n\u003cdependency\u003e\n  \u003cgroupId\u003ecom.alpermulayim\u003c/groupId\u003e\n  \u003cartifactId\u003eopenfoodfacts-spring-boot-starter\u003c/artifactId\u003e\n  \u003cversion\u003e0.0.2.8\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n**Install the dependencies**\n```java\nmvn clean install \ncd ~/.m2 // check the repositories downloaded.\n```\n\n## Configuration\n**Create configuration file** for OpenFoodFactsWebClientProperties OpenFoodFactsWebClient beans.\n\n```java\n@Configuration\npublic class DemoConfig {\n\n    OpenFoodFactsWebClientProperties properties;\n\n    @Autowired\n    public DemoConfig(OpenFoodFactsWebClientProperties properties) {\n        this.properties = properties;\n    }\n\n    @Bean\n    OpenFoodFactsApi openFoodFactsWebClient(){\n        return new OpenFoodFactsWebClient(properties);\n    }\n}\n```\n**Customizable endpoints and paths via application.yml or application.properties files** \n\nYou are able to customize starter endpoints and base urls, if you do not customize webclient have default configuration. \n\n```java\nopenfoodfacts:\n  base-url: \"https://world.openfoodfacts.org\"\n  prices-base-url: \"https://prices.openfoodfacts.org\",\n  search-path: \"/api/v2/search\"\n  product-path: \"/api/v2/product\"\n  prices-path:\"/api/v1/prices\"\n  username: \"${OPEN_FOOD_FACTS_USERNAME}\"\n  password: \"${OPEN_FOOD_FACTS_PASSWORD}\"\n  \n```\n## **Ready to use 🎉**\n\nSample codes and configuration please check [openfoodfacts-starter-demo](https://github.com/AlperMulayim/openfoodfacts-spring-boot-starter/tree/main/openfoodfacts-starter-demo)\n\nDemo Application README: [Demo Application Readme](https://github.com/AlperMulayim/openfoodfacts-spring-boot-starter/blob/main/DemoApp-README.md)\n```java\n@Service\npublic class DemoOpenFoodFactsService {\n    @Autowired\n    OpenFoodFactsApi webClient;\n\n    public OpenFoodFactsResponse request(){\n\t//we are able to create selected fields via ProductField. \n       List\u003cProductField\u003e fields = new ArrayList\u003c\u003e();\n        fields.add(ProductField.PRODUCT_NAME);\n        fields.add(ProductField.CODE);\n        fields.add(ProductField.NUTRISCORE_SCORE);\n        fields.add(ProductField.IMAGE_URL);\n        fields.add(ProductField.NUTRISCORE_DATA);\n        fields.add(ProductField.NUTRITION_GRADES);\n        fields.add(ProductField.BRANDS);\n        fields.add(ProductField.INGREDIENTS_TEXT);\n       return webClient.getProduct(\"5449000000996\",fields);\n    }\n\n    public OpenFoodFactsResponse request(String productCode){\n        return webClient.getProduct(productCode);\n    }\n\n    public OpenFoodFactsPageResponse search(ProductSearchRequest request)\n            throws InvocationTargetException, IllegalAccessException {\n        return webClient.searchProduct(request);\n    }\n    \n    public OpenFoodFactsPageResponse searchCustom() throws InvocationTargetException, IllegalAccessException {\n        List\u003cProductField\u003e fields = new ArrayList\u003c\u003e();\n        fields.add(ProductField.PRODUCT_NAME);\n        fields.add(ProductField.CODE);\n        fields.add(ProductField.IMAGE_URL);\n        fields.add(ProductField.BRANDS);\n        fields.add(ProductField.INGREDIENTS_TEXT);\n\n        ProductSearchRequest request = ProductSearchRequest.builder()\n                .brandsTags(\"nutella\")\n                .pageSize(3)\n                .fields(fields)\n                .build();\n        return webClient.searchProduct(request);\n    }\n\n public List\u003cDemoProduct\u003e searchDemoProducts() {\n\t//will request for ETI products total 5. \n\tProductSearchRequest request = searchRequest(\"eti\",5);\n\tOpenFoodFactsPageResponse response = webClient.searchProduct(request);\n\n\t//convert the OpenFoodFacts product to custom product \u003cDemoProduct\u003e \n\treturn response.products().stream()\n\t\t.map(product -\u003enew DemoProduct(product.code(), product.product_name(),product.imageUrl()))\n\t\t.collect(Collectors.toList());\n    }\n}\n```\n### OpenPrices Demo Usecase\n```java\n  public OpenPriceFactsResponse getProductPrice(String productCode){\n        return webClient.findPrice(productCode);\n    }\n\n    public OpenPriceFactsResponse searchPrice(PriceRequest request){\n        return webClient.findPrice(request);\n    }\n\n    public OpenPriceFactsResponse searchPriceCustom(){\n        PriceRequest priceRequest = PriceRequest.builder()\n                .priceGt(2.0)\n                .priceLt(5.0)\n                .size(3)\n                .build();\n        return webClient.findPrice(priceRequest);\n    }\n\n    public List\u003cDemoPrice\u003e myDemoSearchMyProductPrices(){\n        PriceRequest priceRequest = PriceRequest.builder()\n                .priceGt(2.0)\n                .priceLt(5.0)\n                .build();\n\n        OpenPriceFactsResponse priceResponse = webClient.findPrice(priceRequest);\n\n        return priceResponse.prices().stream()\n                .map(productPrice -\u003e createDemoPrice(productPrice))\n                .collect(Collectors.toList());\n    }\n    private DemoPrice createDemoPrice(ProductPrice productPrice){\n        String productName = productPrice.productName();\n        String productCode = productPrice.productCode();\n        String brand = productPrice.product().brands();\n        String country = productPrice.location().osmAddressCountryCode();\n        Double price = productPrice.price();\n        String currency = productPrice.currency();\n        String store = productPrice.location().osmBrand();\n        String imageUrl = productPrice.product().imageUrl();\n\n        return new DemoPrice(productCode,productName,brand,store,country,currency,price,imageUrl);\n    }\n```\n\n\n### Product Save Demo Usecase\n``````java\n public ProductSaveResponse saveProductCustom(){\n         ProductSaveRequest request = ProductSaveRequest.builder()\n                    .code(\"484848484\")\n                    .brands(\"fakebrand-test\")\n                    .productName(\"fakeproduct-test\")\n                    .ingredientsText(\"fake,ingredients,test1,test2,test3\")\n                    .comment(\"fake,comment\")\n                    .build();\n         return webClient.saveProduct(request);\n    }\n``````\n\n### Image Upload Demo Usecase\n```````java\npublic String uploadProductImage(String code, String lang, String facet, MultipartFile file) throws IOException {\n\n        ProductImageUploadRequest request = ProductImageUploadRequest.builder()\n                .productCode(code)\n                .language(Language.fromCode(lang))\n                .file(file)\n                .facet(facet)\n                .build();\n\n        return  webClient.uploadProductImage(request);\n    }\n```````\n\n  ### Author  [Alper Mulayim](https://github.com/AlperMulayim) connect with me!\n[![image](https://img.shields.io/badge/LinkedIn-0077B5?style=for-the-badge\u0026logo=linkedin\u0026logoColor=white)](https://www.linkedin.com/in/alpermulayim/) \n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falpermulayim%2Fopenfoodfacts-spring-boot-starter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falpermulayim%2Fopenfoodfacts-spring-boot-starter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falpermulayim%2Fopenfoodfacts-spring-boot-starter/lists"}