【问题标题】:Spring boot REST API Missing URI template variableSpring Boot REST API 缺少 URI 模板变量
【发布时间】:2018-06-19 20:47:21
【问题描述】:

我已经关注this tutorial 使用 Spring boot 构建 REST API。它教了很多。但我想做的事情真的让我陷入了困境。 我想要得到的是:

{
     "marks":{
          "id":"1",
          "name":"test",
          "remark":"passed",
          "course": {
              "id": "1",
              "name": "Spring Boot",
              "description": "Solves many problems",
              "topic": {
                 "id": "1",
                 "name": "Java",
                 "description": "Powerful Programming Language"
    }
}

但是当我尝试添加标记时出现错误:

{
    "timestamp": 1515600105327,
    "status": 500,
    "error": "Internal Server Error",
    "exception": "org.springframework.web.bind.MissingPathVariableException",
    "message": "Missing URI template variable 'courseId' for method parameter of type String",
    "path": "/topics/1/courses/1/marks"
}

我的标记模型是:

public class Marks {

    @Id
    private String id;

    private String name;
    private String remark;

    @ManyToOne
    private Course course;

    @ManyToOne
    private Topic topic;

    public Marks() {

    }

    public Topic getTopic() {
        return topic;
    }

    public void setTopic(Topic topic) {
        this.topic = topic;
    }

    public Marks(String id, String name, String remark,String topicId, String courseId) {
        this.id = id;
        this.name = name;
        this.remark = remark;
        this.topic = new Topic(topicId, "","");
        this.course = new Course(courseId, " ", " ", " ");
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }

    public Course getCourse() {
        return course;
    }

    public void setCourse(Course course) {
        this.course = course;
    }
}

还有MarksController.java

public class MarksController {

    @RestController
    public class MarksController {

    @Autowired
    private MarksService marksService;

    @RequestMapping("/topics/{topicId}/courses/{id}/marks")
    public List<Marks> getAllMarks(@PathVariable String courseId) {
        return marksService.getAllMarks(courseId);
    }

    @RequestMapping(method=RequestMethod.POST, value="/topics/{topicId}/courses{courseId}/marks")
    public void addMarks(@RequestBody Marks marks,@PathVariable String topicId ,@PathVariable String courseId) {
        marks.setTopic(new Topic(topicId, "", ""));
        marks.setCourse(new Course(courseId, "", "", ""));
        marksService.addMarks(marks);
    }
}

还有MarksService.java

public class MarksService {

    @Service
    public class MarksService {

    @Autowired
    private MarksRepository marksRepository;

    public void addMarks(Marks marks) {
        marksRepository.save(marks);
    }
}

还有MarksRepository.java:

public interface MarksRepository extends CrudRepository<Marks, String> {

    public List<Marks> findByCourseId(String courseId);

    public List<Marks> findByTopicId(String topicId);

}

谁能帮我得到上面提到的 JSON 中的结果。

【问题讨论】:

    标签: java rest api maven spring-boot


    【解决方案1】:

    对于POST 方法

    这个:

    /topics/{topicId}/courses{courseId}/marks
    

    应该是:

    /topics/{topicId}/courses/{courseId}/marks
    

    注意courses{courseId}之间的附加/

    对于GET 方法

    这个:

    /topics/{topicId}/courses/{id}/marks
    

    应该是:

    /topics/{topicId}/courses/{courseId}/marks
    

    注意使用courseIdMarksController.getAllMarks 中的参数名称一致。

    【讨论】:

    • 谢谢。会做改变。我想要做的是添加标记,但它给出了错误。 ://
    • 我认为问题很明确。此错误消息:“缺少 URI 模板变量 'courseId' ...”路径:“/topics/1/courses/1/marks”告诉我们 Spring 无法填充 MarksController.getAllMarkscourseId 参数。原因是该方法的注释没有声明{courseId},而是声明了{id}。 @RequestMapping 注解中的占位符参数的名称必须与注解方法的参数名称匹配。 POST 方法中也有类似的错误,所以我在答案中也提到了。
    猜你喜欢
    • 2013-11-17
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 1970-01-01
    • 2016-08-11
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多