当前位置: 首页 > 知识库问答 >
问题:

在Spring中找不到任何对象时返回404

施飞昂
2023-03-14

我正在做一个用Spring框架制作的项目。我已经多年没有接触过Java了,这对我来说都是全新的。该项目具有以下UI控制器,显示产品信息:

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

import java.util.List;
import java.util.ArrayList;

@Controller
public class UiController {

    private ProductService productService;
    private LocationService locationService;
    private InventoryService inventoryService;
    private CartService cartService;


    public UiController(
            ProductService productService,
            LocationService locationService,
            InventoryService inventoryService,
            CartService cartService) {
        this.productService = productService;
        this.locationService = locationService;
        this.inventoryService = inventoryService;
        this.cartService = cartService;

    }

    @GetMapping("/")
    public String home(Model model) {
        model.addAttribute("products", productService.getAllProducts());
        return "index";
    }
    @GetMapping("/brand/{brand}")
    public String brand(Model model, @PathVariable String brand) {
        model.addAttribute("products", productService.getProductByBrand(brand));
        return "index";
    }

    @GetMapping("/product/{productId}")
    public String product(Model model, @PathVariable String productId) {
        Product prod = productService.getProduct(productId);
        ArrayList<Product> ps = new ArrayList<Product>();
        ps.add(prod);
        model.addAttribute("products", ps);
        return "index";
    }
}

为了配合这个控制器,我有一个html模板:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>Product Listing</h1>
<table>
    <tr>
        <th>PRODUCT ID</th>
        <th>PRICE</th>
        <th>DESCRIPTION</th>
        <th>BRAND</th>
    </tr>
    <tr th:each="product : ${products}">
        <td th:text="${product.getProductId()}"/>
        <td th:text="${product.getPrice()}"/>
        <td th:text="${product.getDescription()}"/>
        <td th:text="${product.getBrand()}"/>
    </tr>
</table>

</body>
</html>

当没有产品时——这意味着如果我的ArrayList产品的size()为0,我想显示404。

我怎么能这么做?


共有1个答案

花高爽
2023-03-14

从你的url来看,你似乎在寻找一个具有给定id的特定产品。从这个请求返回一个模板,甚至将其放入一个列表(总是有一个值)都没有多大意义。对于异步,您可以编写:

@GetMapping("/product/{productId}")
public ResponseEntity<Product> product(Model model, @PathVariable String productId) {
    Product prod = productService.getProduct(productId);
    if(prod == null) {
        return new ResponseEntity<Product>(null, HttpStatus.NOT_FOUND);
    } else {
        return new ResponseEntity<Product>(prod, HttpStatus.OK);
    }
}

如果您真的需要返回一个模板,您可以在模型中放置一个状态变量,并在客户端检查它的状态。

或者如果你想重定向,只做检查和建立返回字符串符合。

@GetMapping("/product/{productId}")
public String product(Model model, @PathVariable String productId) {
    Product prod = productService.getProduct(productId);
    if(prod == null) {
        return "errors/404";
    } else {
        return "index";
    }
}
 类似资料:
  • 我有一个实现Spring Security和Spring OAuth2安全的项目。当我请求访问令牌时,它工作得很好,但当我使用访问令牌请求资源时,我得到了“在SecurityContext中没有找到身份验证对象”。 我的项目的SecurityContext是: 我使用http://localhost:8060/oauth/token请求令牌?grant_type=password&client_i

  • 我正在使用一个双端队列(java.util.Dequeue),希望在队列中找到一个对象并返回它。 我目前正在使用方法检查队列是否包含对象,但不知道如何获取找到的对象的实际实例。正在搜索的实例不是同一个实例,因为我正在重写方法来测试类变量子集的相等性。 如果不可能使用退出来做到这一点,那么我应该用什么来代替呢?我需要将对象推送到列表的两端,并从一开始就将其删除。显然能够搜索一个对象并得到它的实例化。

  • 我以为我的授权实现已经完成,但是当试图检索用户详细信息对象时,我得到的只是用户名。 我正在使用oauth,并提供以下详细信息。 配置AuthenticationManager: 完成后,我可以调试到我的userDetailsService: 这完成得很好,我的客户端得到了JWT。但是我在调试以后的控制器方法时发现了以下问题。 在本例中,injectedUser=null,auth是一个OAuth2

  • 我使用mysql存储过程来检索对象列表。这可能吗? 我在看这篇文章 问题: > 如何使用结果集检索select语句中的对象列表? 如何将结果集映射到对象列表? CREATE DEFINER=@PROCEDURE(ININT,OUTINT,OUTINT,OUTVARCHAR(50),OUTVARCHAR(50),OUTFLOAT 内部连接(从rate中选择aid,r.rate,re.country_

  • 我有下面的,它的返回类型是或。中的响应实体是基于的这些返回类型形成的。 如何: 1。设计以返回不同类型的 2。使根据其接收形成 这是控制器