You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将自定义POJO转换为符合Microsoft Graph要求的JSON请求体?

问题描述

我需要向https://graph.microsoft.com/v1.0/me/sendMail接口发送POST请求发送邮件,已经写了带getter/setter的SendEmail POJO用来动态设置JSON参数,但测试类里生成的jsonRequest只序列化了ToRecipient对象,完全匹配不上接口要求的格式。请帮忙指导怎么用这个POJO构建出符合下面示例结构的完整JSON请求体。


SendEmail.java

import java.util.ArrayList;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.annotation.JsonProperty;
public class SendEmail {
   
    public class Body{
        public String contentType;
        public String content;

        public void setContentType(String contentType) {
            this.contentType = contentType;
        }

        public String getContentType() {
            return contentType;
        }

        public void setContent(String content) {
            this.content = content;
        }

        public String getContent() {
            return content;
        }
    }

    public class CcRecipient{
        public EmailAddress emailAddress;

        public void setEmailAddress(SendEmail.EmailAddress emailAddress) {
            this.emailAddress = emailAddress;
        }

        public SendEmail.EmailAddress getEmailAddress() {
            return emailAddress;
        }
    }

    public class EmailAddress{
        public String address;

        public void setAddress(String address) {
            this.address = address;
        }

        public String getAddress() {
            return address;
        }
    }

    public class Message{
        public String subject;
        public Body body;
        public ArrayList<ToRecipient> toRecipients;
        public ArrayList<CcRecipient> ccRecipients;

        public void setSubject(String subject) {
            this.subject = subject;
        }

        public String getSubject() {
            return subject;
        }

        public void setBody(SendEmail.Body body) {
            this.body = body;
        }

        public SendEmail.Body getBody() {
            return body;
        }

        public void setToRecipients(ArrayList<SendEmail.ToRecipient> toRecipients) {
            this.toRecipients = toRecipients;
        }

        public ArrayList<SendEmail.ToRecipient> getToRecipients() {
            return toRecipients;
        }

        public void setCcRecipients(ArrayList<SendEmail.CcRecipient> ccRecipients) {
            this.ccRecipients = ccRecipients;
        }

        public ArrayList<SendEmail.CcRecipient> getCcRecipients() {
            return ccRecipients;
        }
    }

    public class Root{
        public Message message;
        public String saveToSentItems;

        public void setMessage(SendEmail.Message message) {
            this.message = message;
        }

        public SendEmail.Message getMessage() {
            return message;
        }

        public void setSaveToSentItems(String saveToSentItems) {
            this.saveToSentItems = saveToSentItems;
        }

        public String getSaveToSentItems() {
            return saveToSentItems;
        }
    }

    public class ToRecipient{
        public EmailAddress emailAddress;

        public void setEmailAddress(SendEmail.EmailAddress emailAddress) {
            this.emailAddress = emailAddress;
        }

        public SendEmail.EmailAddress getEmailAddress() {
            return emailAddress;
        }
    }
}

Test.java(原代码)

SendEmail sendEmail = new SendEmail();
    
    SendEmail.Message message = sendEmail.new Message();
    message.setSubject("Test subject");
    
    SendEmail.Body body = sendEmail.new Body();
    body.setContent("this is a test body on an email");
    
    SendEmail.ToRecipient toRecipient = sendEmail.new ToRecipient();
    
    SendEmail.EmailAddress emailAddress = sendEmail.new EmailAddress();
    emailAddress.setAddress("dummyemail@outlook.com");
    toRecipient.setEmailAddress(emailAddress);
   
    String accessToken = connectEmail(); System.out.println("ACCESS TOKEN: "+accessToken);
    HttpURLConnection connection = null;
    
    Gson gson = new Gson();
    String jsonRequest = gson.toJson(toRecipient);
    
    try {
        URL url = new URL("https://graph.microsoft.com/v1.0/me/sendMail");
        
        connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("POST");
        connection.setRequestProperty("Authorization","Bearer "+accessToken);
           
        connection.setRequestProperty("Content-Type", "application/json");
        //connection.setRequestProperty("Accept", "text/plain");
        connection.setUseCaches(false);
        connection.setDoOutput(true);
                  
        try(OutputStream os = connection.getOutputStream()) {                
            System.out.println("jsonRequest: "+jsonRequest);               
            os.write(jsonRequest.getBytes());
        }
    } catch (Exception e) {
        
        System.out.println("EXCEPTION SENDING EMAIL");   
    }

目标请求格式示例

{
  "message": {
    "subject": "Meet for lunch?",
    "body": {
      "contentType": "Text",
      "content": "The new cafeteria is open."
    },
    "toRecipients": [
      {
        "emailAddress": {
          "address": "frannis@contoso.onmicrosoft.com"
        }
      }
    ],
    "ccRecipients": [
      {
        "emailAddress": {
          "address": "danas@contoso.onmicrosoft.com"
        }
      }
    ]
  },
  "saveToSentItems": "false"
}

解决方案

问题根源

你当前只序列化了单个ToRecipient对象,但接口要求的最外层是包含message和saveToSentItems的Root结构,必须把所有层级的对象完整组装后,再序列化最顶层的Root对象。

修正后的Test.java代码

SendEmail sendEmail = new SendEmail();

// 1. 构建收件人邮箱对象并放入集合(支持多个收件人)
SendEmail.EmailAddress toEmail = sendEmail.new EmailAddress();
toEmail.setAddress("dummyemail@outlook.com");
SendEmail.ToRecipient toRecipient = sendEmail.new ToRecipient();
toRecipient.setEmailAddress(toEmail);
ArrayList<SendEmail.ToRecipient> toRecipientsList = new ArrayList<>();
toRecipientsList.add(toRecipient);

// 2. 构建邮件内容Body(补充缺失的contentType字段)
SendEmail.Body body = sendEmail.new Body();
body.setContentType("Text");
body.setContent("this is a test body on an email");

// 3. 组装Message对象,关联主题、Body、收件人
SendEmail.Message message = sendEmail.new Message();
message.setSubject("Test subject");
message.setBody(body);
message.setToRecipients(toRecipientsList);
// 如需抄送人,可参照收件人逻辑构建ccRecipientsList后设置
// message.setCcRecipients(ccRecipientsList);

// 4. 构建最顶层Root对象,匹配接口要求的外层结构
SendEmail.Root root = sendEmail.new Root();
root.setMessage(message);
root.setSaveToSentItems("false");

String accessToken = connectEmail();
System.out.println("ACCESS TOKEN: "+accessToken);
HttpURLConnection connection = null;

Gson gson = new Gson();
// 序列化最顶层的Root对象,而非单个ToRecipient
String jsonRequest = gson.toJson(root);

try {
    URL url = new URL("https://graph.microsoft.com/v1.0/me/sendMail");
    
    connection = (HttpURLConnection) url.openConnection();
    connection.setRequestMethod("POST");
    connection.setRequestProperty("Authorization","Bearer "+accessToken);
       
    connection.setRequestProperty("Content-Type", "application/json");
    connection.setUseCaches(false);
    connection.setDoOutput(true);
              
    try(OutputStream os = connection.getOutputStream()) {                
        System.out.println("jsonRequest: "+jsonRequest);               
        os.write(jsonRequest.getBytes());
    }
} catch (Exception e) {
    e.printStackTrace(); // 建议打印异常栈,方便排查问题
    System.out.println("EXCEPTION SENDING EMAIL");   
}

关键修正点

  • 层级完整组装:从底层EmailAddress开始,依次组装ToRecipient→Body→Message→Root,确保每个层级对象正确关联。
  • 集合处理:toRecipients和ccRecipients是数组类型,必须用ArrayList包裹单个收件人对象,不能直接传单个对象。
  • 序列化顶层对象:最终序列化的是Root对象,它包含接口要求的所有顶级字段。
  • 补充必填字段:原代码缺失Body的contentType字段,这是目标格式中的必填项,必须补上。

内容的提问来源于stack exchange,提问作者Ti J

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 18:05:48