У меня есть простая JSP страница , которая должна отображать 5 продуктов с id , описание , количество . Можете ли вы помочь мне найти проблему?
Я хочу Соединить эту страницу с База данных , список продуктов, перечисленных вручную, будет непрофессиональным и проблемным c, если вы хотите добавить больше продуктов.
Когда я запрашиваю страницу / хранилище у меня есть исключение :
[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";
}
}
StorageService:
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;