Spring Boot AI + Dall-E 3 Image Generation Example

In this tutorial we will be deploying Azure DallE 3 model. Then using a text prompt we will be generating images.

Implementation
Go to Azure AI Foundry.
Deploy Dall E 3 model. Copy the API key.

Modify the application.properties as follows-
azure.openai.api.key=66T7YqY4CaqXB9dsdsdsq1RTz9p45goTXeVAJPpWKERdc5RxRLgJQQJ99BBACYeBjFXJ3w3AAABACOGmCSx azure.openai.endpoint=https://javainuse-service.openai.azure.com/ azure.openai.dalle.model.id=dall-e-3Create a class named ImageGenerationController as follows-
package com.azure.ai.openai.usage; import java.util.ArrayList; import java.util.List; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import com.azure.ai.openai.OpenAIClient; import com.azure.ai.openai.OpenAIClientBuilder; import com.azure.ai.openai.models.ImageGenerationOptions; import com.azure.ai.openai.models.ImageSize; import com.azure.core.credential.AzureKeyCredential; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; @RestController public class ImageGenerationController { @Value("${azure.openai.api.key}") private String azureOpenaiKey; @Value("${azure.openai.endpoint}") private String endpoint; @Value("${azure.openai.dalle.model.id}") private String deploymentOrModelId; private final ObjectMapper objectMapper = new ObjectMapper(); @PostMapping("/generate-image") public ResponseEntity<ImageResponse> generateImage(@RequestBody ImageRequest imageRequest) { try { OpenAIClient client = new OpenAIClientBuilder().endpoint(endpoint) .credential(new AzureKeyCredential(azureOpenaiKey)).buildClient(); ImageGenerationOptions imageOptions = new ImageGenerationOptions(imageRequest.getPrompt()); if (imageRequest.getN() != null) { imageOptions.setN(imageRequest.getN()); } else { imageOptions.setN(1); } if (imageRequest.getSize() != null) { try { String sizeValue = imageRequest.getSize().toUpperCase(); if (sizeValue.equals("256X256")) { imageOptions.setSize(ImageSize.SIZE256X256); } else if (sizeValue.equals("512X512")) { imageOptions.setSize(ImageSize.SIZE512X512); } else if (sizeValue.equals("1024X1024")) { imageOptions.setSize(ImageSize.SIZE1024X1024); } // If none match, the default size will be used } catch (Exception e) { // Log error but continue with default size System.err.println("Invalid image size specified: " + e.getMessage()); } } if (imageRequest.getUserId() != null) { imageOptions.setUser(imageRequest.getUserId()); } Object responseObject = client.getImages(imageOptions); ImageResponse response = parseImageResponse(responseObject); return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(response); } catch (Exception ex) { ex.printStackTrace(); return ResponseEntity.internalServerError() .body(new ImageResponse("Error generating image: " + ex.getMessage())); } } private ImageResponse parseImageResponse(Object responseObject) { ImageResponse response = new ImageResponse(); List<String> imageUrls = new ArrayList<>(); try { String jsonString = objectMapper.writeValueAsString(responseObject); JsonNode rootNode = objectMapper.readTree(jsonString); JsonNode dataNode = rootNode.path("data"); if (dataNode.isArray()) { for (JsonNode item : dataNode) { JsonNode urlNode = item.path("url"); if (!urlNode.isMissingNode()) { imageUrls.add(urlNode.asText()); } } } response.setImageUrls(imageUrls); } catch (Exception e) { e.printStackTrace(); response.setError("Error parsing response: " + e.getMessage()); } return response; } public static class ImageRequest { private String prompt; private Integer n; private String size; private String userId; public String getPrompt() { return prompt; } public void setPrompt(String prompt) { this.prompt = prompt; } public Integer getN() { return n; } public void setN(Integer n) { this.n = n; } public String getSize() { return size; } public void setSize(String size) { this.size = size; } public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } } public static class ImageResponse { private List<String> imageUrls = new ArrayList<>(); private String error; public ImageResponse() { } public ImageResponse(String error) { this.error = error; } public List<String> getImageUrls() { return imageUrls; } public void setImageUrls(List<String> imageUrls) { this.imageUrls = imageUrls; } public String getError() { return error; } public void setError(String error) { this.error = error; } } }If we now call the /image url along with the prompt, we get the image url as response.


Download Source Code
Download it -Spring Boot AI + Azure OpenAI + Image Example