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。
除此之外还有几个需要修正的问题:
删除手动编写的getter/setter:
你已经给ProductEntity和Product添加了@Data注解,Lombok会自动生成标准的getter/setter方法,手动编写的getter/setter不仅多余,还可能出现类型不一致(比如ProductEntity的getProdId返回Long但属性是long),直接删掉所有手动写的getter/setter。删除多余的四参构造方法:
@AllArgsConstructor已经帮你生成了包含所有5个字段的全参构造方法,手动添加的四参构造方法完全多余且无赋值逻辑,直接删除。优化实体转模型的逻辑:
当前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
相关产品推荐
相关产品推荐

