首页 > 解决方案 > JPA Repository.findByAll() 返回 null 但一切都存在于 db

问题描述

我有一个简单的JSP 页面,它应该显示5 个带有iddescriptionamount的产品。你能帮我找出问题吗?

我想将此页面与数据库连接,当您想添加更多产品时,手动列出产品将不专业且有问题。

当我请求页面/存储时,我有一个例外

[ERROR] Servlet.service() for servlet [dispatcherServlet] in context with path [] 
threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause
java.lang.NullPointerException: null
    at (...)StoragePageController.openAllProductsPage(StoragePageController.java:27)

存储.JSP:

<table width="1000" border="0" cellpadding="6" cellspacing="2">
    <c:forEach var="u" items="${productList }">
        <c:set var="licznik" value="${licznik+1}" />
        <tr onmouseover="changeTrBg(this)" onmouseout="defaultTrBg(this)">
            <td align="right"><c:out value="${licznik }" /></td>
            <td align="right"><c:out value="${u.id }" /></td>
            <td align="left"><c:out value="${u.description }" /></td>
            <td align="left"><c:out value="${u.amount }" /></td>
        </tr>
    </c:forEach>
</table>

存储页面控制器:

@Controller
public class StoragePageController {


    private StorageService storageService;

    @GET
    @RequestMapping(value = "/storage")
    public String openAllProductsPage(Model model) {

        List<Product> productList = storageService.findAll();
        model.addAttribute("productList", productList);
        return "storage";
    }
}

存储服务:

public interface StorageService {

    public Product findById(int id);
    List<Product> findAll();
    void updateProduct(int id, int amount);

}

存储服务实现:

@Service("storageService")
@Transactional
public class StorageServiceImpl implements StorageService {

    @Autowired
    private ProductRepository productRepository;

    @Override
    public Product findById(int id) {
        Product product = productRepository.findById(id);
        return product;
    }

    @Override
    public List<Product> findAll() {
        List<Product> productList = productRepository.findAll();
        return productList;
    }

    @Override
    public void updateProduct(int id, int amount) {
        productRepository.updateProductAmount(amount, id);
    }

}

产品存储库:

@Repository("productRepository")
public interface ProductRepository extends JpaRepository<Product, Integer>{

    @Modifying
    @Query(value = "UPDATE Products p SET p.amount = :amount WHERE p.product_id= :id", nativeQuery = true)
    void updateProductAmount(@Param("amount") int amount, @Param("id") int id);

    public Product findById(int id);
}

和**产品:**

@Entity
@Table(name = "products")
public class Product {

    @Id
    @Column(name = "product_id")
    private int id;

    @Column(name = "description")
    @NotNull
    private String description;

    @Column(name = "amount")
    @NotNull
    private int amount;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public int getAmount() {
        return amount;
    }

    public void setAmount(int amount) {
        this.amount = amount;
    }
}

如果需要,请使用 SQL:

DROP TABLE IF EXISTS `products`;
CREATE TABLE `products` (
  `product_id` int(11) NOT NULL AUTO_INCREMENT,
  `description` varchar(255) NOT NULL,
  `amount` INT(64) NOT NULL,
  PRIMARY KEY (`product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=UTF8;

标签: javasqlspring-bootjspjpa

解决方案


您似乎@Autowired在 StoreController 中缺少注释

@Controller
public class StoragePageController {

    @Autowired
    private StorageService storageService;

    @GET
    @RequestMapping(value = "/storage")
    public String openAllProductsPage(Model model) {

        List<Product> productList = storageService.findAll();
        model.addAttribute("productList", productList);
        return "storage";
    }
}

或者

最推荐的依赖注入方式是创建一个包含所有依赖项的构造函数。

@Controller
public class StoragePageController {


    private final StorageService storageService;

    public StoragePageController(StorageService storageService) {
       this.storageService = storageService;
    }

    @GET
    @RequestMapping(value = "/storage")
    public String openAllProductsPage(Model model) {

        List<Product> productList = storageService.findAll();
        model.addAttribute("productList", productList);
        return "storage";
    }
}

推荐阅读