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

开发银行API时Customer关联Address后查询无地址字段如何解决

问题根因及修复步骤

1. 实体关联配置错误

你当前Customer实体的@OneToMany未配置级联和外键关联,且缺少地址字段的get/set方法导致序列化时不会输出该字段,同时双向关联需要在Address实体补充@ManyToOne注解:

修改Address实体

import javax.persistence.*;

@Entity
public class Address {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String street_number;
    private String street_name;
    private String city;
    private String state;
    private String zip;

    // 新增客户关联字段
    @ManyToOne
    @JoinColumn(name = "customer_id")
    private Customer customer;

    public Address() {
    }

    // 新增customer的get/set方法
    public Customer getCustomer() {
        return customer;
    }

    public void setCustomer(Customer customer) {
        this.customer = customer;
    }

    // 原有其他字段的get/set方法保留不变
    // ...
}

修改Customer实体

import com.fasterxml.jackson.annotation.JsonManagedReference;
import javax.persistence.*;
import java.util.Set;

@Entity
public class Customer {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String first_Name;
    private String last_Name;
    
    // 修正关联注解,配置级联、加载策略,添加循环依赖规避注解
    @OneToMany(mappedBy = "customer", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JsonManagedReference
    private Set<Address> addresses;

    public Customer() {
    }

    // 新增addresses的get/set方法,缺失会导致序列化无法输出地址字段
    public Set<Address> getAddresses() {
        return addresses;
    }

    public void setAddresses(Set<Address> addresses) {
        this.addresses = addresses;
    }

    // 原有其他字段的get/set方法保留不变
    // ...
}

2. 请求参数与实体字段不匹配

你POST请求提交的是单个address字段,但实体里是addresses集合,需要调整请求参数格式为:

{
  "id": 1,
  "first_name": "Leon",
  "last_name": "Hunter",
  "addresses": [
    {
      "street_number": "902",
      "street_name": "Walker Road",
      "city": "Clearfield",
      "state": "Pennsylvania",
      "zip": "16830"
    }
  ]
}

3. Service层逻辑bug

原getCustomerById方法查询到客户后没有返回结果,直接抛出异常,修正为:

public ResponseEntity<Customer> getCustomerById(Long customerId) {
    Optional<Customer> customerOpt = customerRepository.findById(customerId);
    if (customerOpt.isPresent()) {
        logger.info("Customer found.");
        return new ResponseEntity<>(customerOpt.get(), HttpStatus.OK);
    }
    throw new CustomerNotFoundException("Customer with id " + customerId + " not found");
}

4. 补充关联绑定逻辑

保存客户时需要给地址设置关联的客户对象,避免外键为空,修改createCustomer方法:

public ResponseEntity<?> createCustomer(Customer customer){
    logger.info("Customer created.");
    // 给所有地址绑定当前客户
    if(customer.getAddresses() != null){
        customer.getAddresses().forEach(address -> address.setCustomer(customer));
    }
    customerRepository.save(customer);

    HttpHeaders responseHeaders = new HttpHeaders();
    URI newCustomerUri = ServletUriComponentsBuilder
            .fromCurrentRequest()
            .path("/{id}")
            .buildAndExpand(customer.getId())
            .toUri();
    responseHeaders.setLocation(newCustomerUri);
    // 直接返回创建完成的客户对象,方便调用方拿到完整数据
    return new ResponseEntity<>(customer, responseHeaders, HttpStatus.CREATED);
}

以上修改完成后,查询客户接口就会正常返回地址相关字段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 06:45:04