如何通过使用日期作为 Quarkus 中的 @PathParam 在 REST API 中使用 GET METHOD 检索资源对象

如何解决如何通过使用日期作为 Quarkus 中的 @PathParam 在 REST API 中使用 GET METHOD 检索资源对象

我是编程新手,我正在尝试构建一个小型饮食跟踪应用程序。我使用 quarkus RESTeasy JAX-RS 和 java 来构建我的 REST API。用户应该能够添加他在一周中的几天吃的食物。

用户必须能够根据日期检索他吃过的食物。我的问题是我无法根据日期检索食物。当我使用时间戳:“2021-06-10T08:44:45.9328079Z[UTC]”作为 GET 方法端点的输入日期时,我在邮递员中收到 400 BAD REQUEST。当我根据 userId 检索食物时,它工作正常。

这是我的 GET 和 POST 方法代码:

@Path("/食物") 公共类控制器{

public static ArrayList<Object> foods = new ArrayList<>();

@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getAllFood(){
    return Response.ok(foods).build();
}

@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Response addFood() throws ParseException {

    foods.add(new Food("Garlic",30,Timestamp.from(Instant.now()),1));
    foods.add(new Food("Onions",20,2));
    return Response.ok(foods).build();

}

@Path("{userId}")
@GET
@Produces(MediaType.APPLICATION_JSON)
public static Response getFoodById(@PathParam("userId") int userId){
    for (Object food : foods){
        if (((Food)food).getUserId()==(userId)){
            return Response.ok(food).build();
        }
    }
    return null;
}

@Path("/second/{time}")
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getFoodByDate(@PathParam("time") Timestamp time){
    for (Object food : foods){
        if (((Food)food).getTime().toString().equals(time.toString())){
            return Response.ok(food).build();
        }
    }
    return null;
}

}

这是食品类:

package org.acme;

导入 java.sql.Timestamp;

公共课食品{

private String foodType;
private int portion;
private Timestamp time;
private int userId;

public Food(){}

public Food(String foodType,int portion,Timestamp time,int userId){
    this.foodType = foodType;
    this.portion = portion;
    this.time = time;
    this.userId = userId;

}

public String getFoodType() {
    return foodType;
}

public void setFoodType(String foodType) {
    this.foodType = foodType;
}

public int getPortion() {
    return portion;
}

public void setPortion(int portion) {
    this.portion = portion;
}

public Timestamp getTime() {
    return time;
}

public void setTime(Timestamp time) {
    this.time = time;
}

public int getUserId() {
    return userId;
}

public void setUserId(int userId) {
    this.userId = userId;
}

@Override
public String toString(){
    return foodType + "," + portion + "," + time + "," + userId;
}

}

解决方法

好的 - Postman 抛出的错误是 400 bad request 的原因是你的输入参数不正确。

示例代码从 @PathParam 更改为 @RequestParam

@Path("/get/second/")
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getFoodByDate(@RequestParam("time") String dateString) throws ParseException{
   ArrayList<Food> foods = new ArrayList<>();
   DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

   Date requestedDate = sdf.parse(dateString);
   for (Object food : foods){
       if (((Food)food).getTime().equals(requestedDate)){
           return Response.ok(food).build();
       }
   }

   return null;
}

在本例中,我更改了您的时间戳参数,因为 java.sql.Timestamp 是 java.util.Date 的薄包装器,允许 JDBC API 将其识别为 SQL TIMESTAMP 值,因此在本例中不建议使用时间戳。

重构 Food 类的示例。

public class Food {
    private String foodType;
    private int portion;
    private Date time;
    private int userId;

    public Food(){}

    public Food(String foodType,int portion,Date time,int userId){
        this.foodType = foodType;
        this.portion = portion;
        this.time = time;
        this.userId = userId;

    } ... //getter and setter

将食物添加到数组列表的示例代码。

    DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    Food food1 = new Food("Garlic",10,sdf.parse("2020-05-01"),1);
    Food food2 = new Food("Onion",20,sdf.parse("2020-05-02"),1);
    Food food3 = new Food("Potato",30,sdf.parse("2020-05-03"),1);
    Food food4 = new Food("Tomato",40,sdf.parse("2020-05-04"),1);

    ArrayList<Food> foods = new ArrayList<>();
    foods.add(food1);
    foods.add(food2);
    foods.add(food3);
    foods.add(food4);

我测试的完整源代码:

package org.example;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

public class Main {

    public static void main(String[] args) throws ParseException {

        DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String dateString = "2020-05-01"; //mocking request date from the @RequestParam
        Date requestedDate = sdf.parse(dateString);

        
        Food food1 = new Food("Garlic",1);
        Food food2 = new Food("Onion",1);
        Food food3 = new Food("Potato",1);
        Food food4 = new Food("Tomato",1);

        ArrayList<Food> foods = new ArrayList<>();
        foods.add(food1);
        foods.add(food2);
        foods.add(food3);
        foods.add(food4);
        
        for (Object food : foods){
            if (((Food)food).getTime().equals(requestedDate)){
                System.out.print(food);
            }
        }

    }
}

输出:Garlic,Fri May 01 00:00:00 SGT 2020,1

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-