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

Spring Boot REST API获取产品返回NULL值问题求助

问题描述

我是Spring Boot和Java新手,正在开发电商项目的REST API。产品能成功存入数据库,但调用GET接口获取产品时,所有字段都显示NULL值。

相关代码文件

控制器类

package com.ecommerce.ecommerceappapi.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.ecommerce.ecommerceappapi.model.Product;
import com.ecommerce.ecommerceappapi.services.ProductService;

@CrossOrigin(origins = "http://localhost:3000")
@RestController
@RequestMapping("api/v1/")
public class ProductController {

    @Autowired
    private final ProductService productService;
    
    public ProductController(ProductService productService) {
        this.productService = productService;
    }
    
    @PostMapping("/products")
    public Product createProduct(@RequestBody Product product) {
        return productService.createProduct(product);
    }
    
    @GetMapping("/products")
    public List<Product> getAllProducts() {
        return productService.getAllProducts();
    }
    
}

实体类

package com.ecommerce.ecommerceappapi.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

import lombok.Data;

@Entity
@Data
@Table(name="products")
public class ProductEntity {
    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    private long prodId;
        
    private String productName;
    private int productPrice;
    private String productDesc;
    private String productData;
    
    public String getProductName() {
        return productName;
    }
    public void setProductName(String productName) {
        this.productName = productName;
    }
    public int getProductPrice() {
        return productPrice;
    }
    public void setProductPrice(int productPrice) {
        this.productPrice = productPrice;
    }
    public String getProductDesc() {
        return productDesc;
    }
    public void setProductDesc(String productDesc) {
        this.productDesc = productDesc;
    }
    public String getProductData() {
        return productData;
    }
    public void setProductData(String productData) {
        this.productData = productData;
    }
    public Long getProdId() {
        // TODO Auto-generated method stub
        return prodId;
    }
}

服务接口

package com.ecommerce.ecommerceappapi.services;

import java.util.List;

import com.ecommerce.ecommerceappapi.model.Product;

public interface ProductService {
    Product createProduct(Product product);
    List<Product> getAllProducts();
}

服务实现类

package com.ecommerce.ecommerceappapi.services;


import java.util.List;
import java.util.stream.Collectors;

import org.springframework.beans.BeanUtils;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Service;

import com.ecommerce.ecommerceappapi.entity.ProductEntity;
import com.ecommerce.ecommerceappapi.model.Product;
import com.ecommerce.ecommerceappapi.repository.ProductRepository;


@Service
public class ProductServiceImpl implements ProductService {

    private ProductRepository productRepository;
    
    public ProductServiceImpl(ProductRepository productRepository) {
        super();
        this.productRepository = productRepository;
    }

    @Override
    public Product createProduct(Product product) {
        // TODO Auto-generated method stub
        ProductEntity productEntity = new ProductEntity();
        BeanUtils.copyProperties(product, productEntity);
        productRepository.save(productEntity);
        return product;
    }
    
    @Override
    public List<Product> getAllProducts(){
        
        List<ProductEntity> productEntities =  productRepository.findAll();
        
        List<Product> products = productEntities.stream().map(product -> new Product(
                product.getProdId(), 
                product.getProductName(), 
                product.getProductPrice(),
                product.getProductDesc()))
                .collect(Collectors.toList());
        
        return products;
        }


}

仓库类

package com.ecommerce.ecommerceappapi.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import com.ecommerce.ecommerceappapi.entity.ProductEntity;

@Repository
public interface ProductRepository extends JpaRepository<ProductEntity, Long> {

}

Product模型类

package com.ecommerce.ecommerceappapi.model;

import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;

//import java.util.List;
import lombok.Data;


@Data
@AllArgsConstructor
@NoArgsConstructor
public class Product {
    private long prodId;
    private String productName;
    private int productPrice;
    private String productDesc;
    private String productData;
    

    
    public Product(Long prodId2, String productName2, int productPrice2, String productDesc2) {
        // TODO Auto-generated constructor stub;
        return; 
    }
    public long getProdId() {
        return prodId;
    }
    public void setProdId(long prodId) {
        this.prodId = prodId;
    }
    public String getProductName() {
        return productName;
    }
    public void setProductName(String productName) {
        this.productName = productName;
    }
    public int getProductPrice() {
        return productPrice;
    }
    public void setProductPrice(int productPrice) {
        this.productPrice = productPrice;
    }
    public String getProductDesc() {
        return productDesc;
    }
    public void setProductDesc(String productDesc) {
        this.productDesc = productDesc;
    }
    public String getProductData() {
        return productData;
    }
    public void setProductData(String productData) {
        this.productData = productData;
    }
    

}

问题排查与解决方案

你怀疑的手动添加的四参构造方法确实是核心问题:

public Product(Long prodId2, String productName2, int productPrice2, String productDesc2) {
    // TODO Auto-generated constructor stub;
    return; 
}

这个构造方法没有给类的任何属性赋值,直接return,导致在getAllProducts方法中通过new Product(...)创建的对象所有字段都是默认值(long类型默认0,String类型默认null),所以接口返回全NULL。

除此之外还有几个需要修正的问题:

  1. 删除手动编写的getter/setter:
    你已经给ProductEntity和Product添加了@Data注解,Lombok会自动生成标准的getter/setter方法,手动编写的getter/setter不仅多余,还可能出现类型不一致(比如ProductEntity的getProdId返回Long但属性是long),直接删掉所有手动写的getter/setter。

  2. 删除多余的四参构造方法:
    @AllArgsConstructor已经帮你生成了包含所有5个字段的全参构造方法,手动添加的四参构造方法完全多余且无赋值逻辑,直接删除。

  3. 优化实体转模型的逻辑:
    当前getAllProducts方法手动构造Product对象时遗漏了productData字段,建议使用BeanUtils.copyProperties简化转换,避免手动构造遗漏字段。

修正后的关键代码

修正后的Product模型类

package com.ecommerce.ecommerceappapi.model;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Product {
    private long prodId;
    private String productName;
    private int productPrice;
    private String productDesc;
    private String productData;
}

修正后的ProductEntity类

package com.ecommerce.ecommerceappapi.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

import lombok.Data;

@Entity
@Data
@Table(name="products")
public class ProductEntity {
    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    private long prodId;
        
    private String productName;
    private int productPrice;
    private String productDesc;
    private String productData;
}

修正后的ProductServiceImpl的getAllProducts方法

@Override
public List<Product> getAllProducts(){
    List<ProductEntity> productEntities =  productRepository.findAll();
    
    return productEntities.stream()
            .map(entity -> {
                Product product = new Product();
                BeanUtils.copyProperties(entity, product);
                return product;
            })
            .collect(Collectors.toList());
}

做完以上修改后,重启项目调用GET接口,就能正常返回产品的所有字段值了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 01:55:22