java - JPA Repository.findByAll() 返回 null 但一切都存在于 db
问题描述
我有一个简单的JSP 页面,它应该显示5 个带有id、description和amount的产品。你能帮我找出问题吗?
我想将此页面与数据库连接,当您想添加更多产品时,手动列出产品将不专业且有问题。
当我请求页面/存储时,我有一个例外:
[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;
解决方案
您似乎@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";
}
}
推荐阅读
- javascript - 如何调用多个 fetch API
- javascript - 在哪里可以找到 EJS-Lint 输出,它应该是什么样的?
- r - 如何删除 ggplot2 填充类别中的模式?
- java - Java 代码中的 Kotlin List 与 java.util.List 泛型类型
- python - 为什么在使用带有 urllib3 的 HTTPS 代理时看到 InvalidProxyConfigurationWarning?
- android - 如何从 Firestore 地图字段中添加/删除?
- c# - Xamarin.Forms - iOS RegisteredForRemoteNotifications 没有被调用
- xml - 使用 DTD 可以指定元素出现的确切数量吗?
- fusionauth - 如何限制用户登录/身份验证访问单个租户中的特定应用程序?
- javascript - 如何从 NodeJS 中的 blob 中获取 WAV 文件