开发银行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
相关产品推荐
相关产品推荐

