springboot接口问题


package com.example.VEEProject.bean;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import lombok.Getter;
import lombok.Setter;


@Entity
@Table(name = "veedata")
public class VeeData {
    @Id
    @GeneratedValue
    private int id;
    @Column(name = "PESTLE category")
    @Getter
    @Setter
    private String PestleCategory;
    @Column(name = "Issue title")
    @Getter
    @Setter
    private String IssueTitle;
    @Column(name = "Issue description")
    @Getter
    @Setter
    private String IssueDescription;
    @Column(name = "Issue type")
    @Getter
    @Setter
    private String IssueType;
    @Column(name = "Implications")
    @Getter
    @Setter
    private String Implications;
    @Column(name = "Impact zone")
    @Getter
    @Setter
    private String ImpactZone;
    @Column(name = "Risk area")
    @Getter
    @Setter
    private String RiskArea;
    @Column(name = "Time horizon")
    @Getter
    @Setter
    private String TimeHorizon;
    @Column(name = "Response")
    @Getter
    @Setter
    private String Response;
    @Column(name = "Related entries")
    @Getter
    @Setter
    private String RelatedEntries;
    @Column(name = "Related themes")
    @Getter
    @Setter
    private String RelatedThemes;
    @Column(name = "Further reading name")
    @Getter
    @Setter
    private String FurtherReadingName;
    @Column(name = "Further reading link")
    @Getter
    @Setter
    private String FurtherReadingLink;

}

请问 springboot 后端中如何写一个根据id和变量名查询变量的值的接口,又如何用postmanAPI做测试?变量名在上方的代码里。

package com.example.VEEProject.dao;

import org.springframework.data.jpa.repository.JpaRepository;

import com.example.VEEProject.bean.VeeData;

public interface VeeDataDao extends JpaRepository<VeeData, Integer> {

}


img

报错是因为返回的类型问题,接口返回类型是String,但是return的类型是VeeData

img

你可以在VeeDataDao中自定义一个查询方法,例如:

public interface VeeDataDao extends JpaRepository<VeeData, Integer> {
    // 根据id和变量名查询变量值
    @Query("select case "
            + "when :varName = 'PestleCategory' then veeData.PestleCategory "
            + "when :varName = 'IssueTitle' then veeData.IssueTitle "
            + "when :varName = 'IssueDescription' then veeData.IssueDescription "
            + "when :varName = 'IssueType' then veeData.IssueType "
            + "when :varName = 'Implications' then veeData.Implications "
            + "when :varName = 'ImpactZone' then veeData.ImpactZone "
            + "when :varName = 'RiskArea' then veeData.RiskArea "
            + "when :varName = 'TimeHorizon' then veeData.TimeHorizon "
            + "when :varName = 'Response' then veeData.Response "
            + "when :varName = 'RelatedEntries' then veeData.RelatedEntries "
            + "when :varName = 'RelatedThemes' then veeData.RelatedThemes "
            + "when :varName = 'FurtherReadingName' then veeData.FurtherReadingName "
            + "when :varName = 'FurtherReadingLink' then veeData.FurtherReadingLink "
            + "else null "
            + "end "
            + "from VeeData veeData where veeData.id = :id")
    String findVarById(@Param("id") int id, @Param("varName") String varName);
}

这个查询方法接收两个参数:id和varName,通过varName判断要查询哪个变量,并返回相应的变量值。

接下来,你可以使用Postman发送一个POST请求,请求的URL为http:/localhost:8080/findVarById,Body选择x-www-form-urlencoded,添加两个key-value:

  • id:表示要查询的数据的id
  • varName:表示要查询的变量名

然后点击Send,就能够在Response Body中看到查询结果。

该回答引用ChatGPT

在Spring Boot中实现一个根据id和变量名查询变量值的接口可以通过以下方式实现:

1、编写Controller类

@RestController
@RequestMapping("/veedata")
public class VeeDataController {

    @Autowired
    private VeeDataRepository veeDataRepository;

    @GetMapping("/{id}/{fieldName}")
    public ResponseEntity<String> getFieldValueById(@PathVariable("id") Integer id,
                                                     @PathVariable("fieldName") String fieldName) {
        Optional<VeeData> optionalVeeData = veeDataRepository.findById(id);

        if (optionalVeeData.isPresent()) {
            VeeData veeData = optionalVeeData.get();
            try {
                Field field = VeeData.class.getDeclaredField(fieldName);
                field.setAccessible(true);
                Object value = field.get(veeData);
                return ResponseEntity.ok(value.toString());
            } catch (NoSuchFieldException | IllegalAccessException e) {
                e.printStackTrace();
            }
        }

        return ResponseEntity.notFound().build();
    }

}


2、编写Repository类


@Repository
public interface VeeDataRepository extends JpaRepository<VeeData, Integer> {
}

3、在Postman中测试接口
在Postman中,选择 GET 方法,将 URL 设置为 http://localhost:8080/veedata/%7Bid%7D/%7BfieldName%7D%EF%BC%8C%E5%85%B6%E4%B8%AD {id} 是数据库表中记录的id值,{fieldName} 是要查询的字段名。例如,如果要查询 id 为 1 的记录中的 Issue title 字段的值,URL 应该设置为 http://localhost:8080/veedata/1/IssueTitle%E3%80%82

然后点击发送请求,就可以在返回的响应中看到查询到的值。

https://www.baidu.com/link?url=WQRL2h1REc9b6w8n0RA5kiDolAXeY7HSuz7PsnEefRK2QRkyFhAV9ewvBTAVWbmFlnEwwg3gUCIgyvOwxuB8NCBP9AktnxAcIysPoX8TXja&wd=&eqid=9eb46d620009588d0000000663ef218d

可以使用Spring Data JPA提供的方法,在Repository接口中添加一个自定义方法,方法名应以"findBy"开头,后面跟要查询的属性名,最后再跟上id,方法参数中需要加上变量名:


@Repository
public interface VeeDataRepository extends JpaRepository<VeeData, Integer> {
    String findPestleCategoryById(int id);
}

这个方法将返回指定id对应的行中“PESTLE category”列的值。同理,你可以添加其他自定义方法来查询其他属性。

接下来可以使用Postman来测试这个接口。首先在Postman中创建一个GET请求,将请求URL设置为接口的URL,例如:http://localhost:8080/veedata/findPestleCategoryById/1,其中“1”为你要查询的id。接着发送请求,就会得到对应id的“PESTLE category”值。

要编写一个根据id和变量名查询变量值的接口,你需要在你的Controller类中编写一个方法,该方法需要使用@RequestParam注解来接受id和变量名参数,并调用JpaRepository中提供的findBy方法来查询数据库中的数据。下面是一个示例代码:

@GetMapping("/veedata/{id}/variable")
public String getVariableByIdAndName(@PathVariable int id, @RequestParam String name) {
    VeeData veeData = veeDataDao.findById(id).orElse(null);
    if (veeData == null) {
        return "VeeData not found for id " + id;
    }
    switch (name) {
        case "PestleCategory":
            return veeData.getPestleCategory();
        case "IssueTitle":
            return veeData.getIssueTitle();
        case "IssueDescription":
            return veeData.getIssueDescription();
        case "IssueType":
            return veeData.getIssueType();
        case "Implications":
            return veeData.getImplications();
        case "ImpactZone":
            return veeData.getImpactZone();
        case "RiskArea":
            return veeData.getRiskArea();
        case "TimeHorizon":
            return veeData.getTimeHorizon();
        case "Response":
            return veeData.getResponse();
        case "RelatedEntries":
            return veeData.getRelatedEntries();
        case "RelatedThemes":
            return veeData.getRelatedThemes();
        case "FurtherReadingName":
            return veeData.getFurtherReadingName();
        case "FurtherReadingLink":
            return veeData.getFurtherReadingLink();
        default:
            return "Variable name not found: " + name;
    }
}

在这个例子中,我们使用了@GetMapping注解来声明一个GET请求的接口,路径为"/veedata/{id}/variable",其中{id}表示接受一个整数id作为路径变量,@RequestParam注解用于接受变量名参数,接着我们从数据库中查询出对应id的数据,如果没有找到则返回相应的错误信息。然后我们使用switch语句来根据变量名返回对应的值。

使用Postman测试这个接口,你可以发送一个GET请求到"http://localhost:8080/veedata/1/variable?name=IssueTitle%22%EF%BC%8C%E5%85%B6%E4%B8%AD1%E6%98%AFid%E7%9A%84%E5%80%BC%EF%BC%8CIssueTitle%E6%98%AF%E5%8F%98%E9%87%8F%E5%90%8D%EF%BC%8C%E5%A6%82%E6%9E%9C%E4%B8%80%E5%88%87%E6%AD%A3%E5%B8%B8%EF%BC%8C%E4%BD%A0%E5%BA%94%E8%AF%A5%E4%BC%9A%E6%94%B6%E5%88%B0%E4%B8%80%E4%B8%AA%E5%93%8D%E5%BA%94%EF%BC%8C%E5%85%B6%E4%B8%AD%E5%8C%85%E5%90%ABIssueTitle%E7%9A%84%E5%80%BC%E3%80%82

按照您提供的代码片段其实已经可以通过实体类对应的数据表查询出来ID对应的一条数据记录,此时会返回整个实体对应的数据。

可以有多种方式来获取指定属性的值:
1. 返回整条数据,再选取指定值

img

只需要返回整个实体类 VeeData SpringBoot会自动帮我们进行数据映射,浏览器访问接口地址会直接输出json格式的查询结果。
既然我们能取到整个记录,那么只需要根据需求选取需要的字段数据即可,javascript中可以直接通过JSON.parse(返回的数据体).属性名 的方式来获取结果。

2. 在controller方法中,根据返回的实体对象通过反射来获取指定字段的值,例如

img

要根据id和变量名查询变量的值,可以创建一个GET接口,使用Spring Data JPA的内置方法findById()来获取id所对应的记录,然后再通过Java反射机制获取指定变量名的值。

在VeeData类中添加以下方法:

public Object getFieldValue(String fieldName) throws NoSuchFieldException, IllegalAccessException {
    Field field = getClass().getDeclaredField(fieldName);
    field.setAccessible(true);
    return field.get(this);
}

这个方法使用Java反射机制获取指定变量名的值,如果指定的变量不存在,则会抛出NoSuchFieldException异常。

然后创建一个VeeDataController类,并添加如下代码:


@RestController
@RequestMapping("/veedata")
public class VeeDataController {
    @Autowired
    private VeeDataDao veeDataDao;

    @GetMapping("/{id}/{fieldName}")
    public ResponseEntity<?> getFieldValueByIdAndFieldName(@PathVariable int id, @PathVariable String fieldName) {
        try {
            VeeData veeData = veeDataDao.findById(id).orElse(null);
            if (veeData == null) {
                return ResponseEntity.notFound().build();
            }
            Object value = veeData.getFieldValue(fieldName);
            return ResponseEntity.ok(value);
        } catch (NoSuchFieldException | IllegalAccessException e) {
            return ResponseEntity.badRequest().body("Invalid field name");
        }
    }
}

这个Controller类中添加了一个根据id和fieldName查询变量值的GET接口。它接受两个路径参数:id和fieldName,其中id表示需要查询的记录的id,fieldName表示需要查询的变量名。

该接口首先通过VeeDataDao获取id所对应的VeeData记录,然后调用getFieldValue()方法获取指定变量名的值。如果指定的id不存在,则返回404状态码,如果指定的变量名不存在,则返回400状态码,否则返回变量的值。

接口测试可使用Postman API客户端,按以下步骤进行:

1.打开Postman,选择GET请求方式
2.输入请求的URL,格式为:http://localhost:8080/veedata/%7Bid%7D/%7BfieldName%7D%EF%BC%8C%E5%85%B6%E4%B8%AD%7Bid%7D%E5%92%8C%7BfieldName%7D%E4%B8%BA%E5%AE%9E%E9%99%85%E5%8F%82%E6%95%B0%E5%80%BC%EF%BC%8C%E4%BE%8B%E5%A6%82%EF%BC%9Ahttp://localhost:8080/veedata/1/IssueDescription
3.点击发送请求按钮,如果一切正常,将会得到一个表示变量值的响应体。如果出现错误,将会得到一个表示错误信息的响应体。

题主,这个问题我来替你解决,若有帮助,还望采纳,点击回答右侧采纳即可。
若有任何问题,我可以私下教你。


请问 springboot 后端中如何写一个根据id和变量名查询变量的值的接口,又如何用postmanAPI做测试?变量名在上方的代码里。
1、如何如何写一个根据id和变量名查询变量的值的接口,具体代码演示如下:
VeeDataDao.java

    @Select("select veedata from user where id = #{userId}")
    String findById(@Param("id") String id);

2、postmanAPI接口测试:
在你postman上输入如下地址:

http://localhost:8080/getdata?id=1&keyword=xxx

如上id是入参,我随便设置的id=1,且keyword =xxx,具体的入参改成你自己的即可。

img

可以在Controller中写一个请求处理方法来实现这个接口。

首先,你需要注入 VeeDataDao 的实例,并且添加一个处理 GET 请求的方法。代码如下:

@RestController
public class VeeDataController {
    
    @Autowired
    private VeeDataDao veeDataDao;

    @GetMapping("/veedata/{id}/{variableName}")
    public ResponseEntity<String> getVariable(@PathVariable Integer id, @PathVariable String variableName) {
        VeeData veeData = veeDataDao.findById(id).orElse(null);
        if (veeData == null) {
            return ResponseEntity.notFound().build();
        }

        String value = getValueByVariableName(veeData, variableName);
        if (value == null) {
            return ResponseEntity.notFound().build();
        }

        return ResponseEntity.ok(value);
    }

    private String getValueByVariableName(VeeData veeData, String variableName) {
        switch (variableName) {
            case "PestleCategory":
                return veeData.getPestleCategory();
            case "IssueTitle":
                return veeData.getIssueTitle();
            case "IssueDescription":
                return veeData.getIssueDescription();
            case "IssueType":
                return veeData.getIssueType();
            case "Implications":
                return veeData.getImplications();
            case "ImpactZone":
                return veeData.getImpactZone();
            case "RiskArea":
                return veeData.getRiskArea();
            case "TimeHorizon":
                return veeData.getTimeHorizon();
            case "Response":
                return veeData.getResponse();
            case "RelatedEntries":
                return veeData.getRelatedEntries();
            case "RelatedThemes":
                return veeData.getRelatedThemes();
            case "FurtherReadingName":
                return veeData.getFurtherReadingName();
            case "FurtherReadingLink":
                return veeData.getFurtherReadingLink();
            default:
                return null;
        }
    }
}

这个方法可以处理请求形如 http://localhost:8080/veedata/1/PestleCategory 的 URL,并返回 id 为 1 的 VeeData 对象中 PestleCategory 的值。

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632