有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JPA存储库。findByAll()返回null,但数据库中存在所有内容

我有一个简单的JSP页面,它应该显示5个产品,带有id说明数量。你能帮我找个问题吗

我想这个页面与数据库连接起来,当你想添加更多产品时,手动列出的产品将不专业且有问题

当我请求页面/storage时,我有一个异常

[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>

StoragePageController:

@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);

}

StorageServiceImpl:

@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);
    }

}

ProductRepository:

@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;

共 (1) 个答案

  1. # 1 楼答案

    似乎StoreController中缺少了@Autowired注释

    @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";
        }
    }