【问题标题】:JPA Repository.findByAll() returns null but everything exists in dbJPA Repository.findByAll() 返回 null 但一切都存在于 db
【发布时间】:2020-07-14 06:38:51
【问题描述】:

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

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

当我请求页面 /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)

Storage.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);
    }

}

产品存储库:

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

【问题讨论】:

    标签: java sql spring-boot jsp jpa


    【解决方案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";
        }
    }
    

    【讨论】:

    • @Autowired 注释有效!为什么我总是犯那些愚蠢而容易犯的错误:D?非常感谢:-)关于构造函数我会研究一下,这似乎很有趣
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 2021-06-06
    • 1970-01-01
    • 2017-08-06
    • 1970-01-01
    相关资源
    最近更新 更多