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
Popular Posts
1Z0-830 Java SE 21 Developer Certification
Azure AI Foundry Hello World
Azure AI Agent Hello World
Foundry vs Hub Projects
Build Agents with SDK
Bing Web Search Agent
Function Calling Agent
Spring Boot + Azure Key Vault Hello World Example
Spring Boot + Elasticsearch + Azure Key Vault Example
Spring Boot Azure AD (Entra ID) OAuth 2.0 Authentication
Deploy Spring Boot App to Azure App Service
Secure Azure App Service using Azure API Management
Deploy Spring Boot JAR to Azure App Service
Deploy Spring Boot + MySQL to Azure App Service
Spring Boot + Azure Managed Identity Example
Secure Spring Boot Azure Web App with Managed Identity + App Registration
Elasticsearch 8 Security - Integrate Azure AD OIDC