簡體   English   中英

Postman 查詢 rest 端點后返回錯誤消息

[英]Postman returning error message after query for a rest endpoint

收到錯誤消息,我已盡我所能排除故障,但它不起作用。 我不斷收到錯誤消息,可能是什么問題?

這是 controller:

package com.Controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.Model.*;
import com.Service.UserAccountService;


@RestController
public class UserController {

    @Autowired
    UserAccountService userService;

    @RequestMapping(path = "/users/")
    public List<UserAccount> getUsers()
    {
        return userService.getUsers();
    }
}

這是Service接口和ServiceImpl:

package com.Service;

import java.util.List;

import com.Exceptions.UserNotFoundException;
import com.Model.UserAccount;


public interface UserAccountService {

    UserAccount save(UserAccount user) throws Exception;

    List<UserAccount> getUsers();

    UserAccount update(UserAccount user, int id) throws Exception;

    //UserAccount delete(UserAccount user) throws Exception;

    UserAccount userAccountByKey(int id) throws UserNotFoundException;
   }

這是服務實現的代碼:

package com.ServiceImpl;

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

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.Exceptions.UserNotFoundException;
import com.Model.UserAccount;
import com.Repository.UserRepo;
import com.Service.UserAccountService;

@Service
public class UserAccountServiceImplementation implements UserAccountService {

@Autowired  
private UserRepo repo;


@Override
public List<UserAccount> getUsers() {
    // TODO Auto-generated method stub
    List<UserAccount> users = new ArrayList<>();
    repo.findAll().forEach(users::add);
    return users;
}

這是 model 的代碼:

package com.Model;

import java.util.Date;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
//import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.NotNull;

@Entity
public class UserAccount {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;
    @NotNull
    private String userName;
    private String email;
    @Temporal(TemporalType.DATE)
    private Date dateCreated;
    @OneToMany(mappedBy = "userAccount", fetch = FetchType.EAGER)
    private Set <Transaction> transactions = new HashSet<>();


    public UserAccount(int id) {
        super();
        this.id = id;
    }


    public UserAccount(String userName, String email, Date dateCreated) {
        super();
        this.userName = userName;
        this.email = email;
        this.dateCreated = dateCreated;
    }


    public UserAccount(int id, String userName, String email, Date dateCreated) {
        super();
        this.id = id;
        this.userName = userName;
        this.email = email;
        this.dateCreated = dateCreated;
    }


    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public Date getDateCreated() {
        return dateCreated;
    }
    public void setDateCreated(Date dateCreated) {
        this.dateCreated = dateCreated;
    }
    public Set<Transaction> getTransactions() {
        return transactions;
    }
    public void setTransactions(Set<Transaction> transactions) {
        this.transactions = transactions;
    }


    @Override
    public int hashCode() {
        return Objects.hash(id,userName,email,dateCreated);

    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        UserAccount other = (UserAccount) obj;
        if (!Objects.equals(this.id, other.id)) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder ("UserAccount{");
        sb.append("id=").append(id);
        sb.append(",username='").append(userName).append('\'');
        sb.append(",email='").append(email).append('\'');
        sb.append(",date='").append(dateCreated).append('\'');
        sb.append('}');
        return sb.toString();
    }
}

這是我的 application.properties 數據:

  spring.h2.console.enabled=true
  spring.datasource.platform=h2
  spring.datasource.driverClassName=org.h2.Driver
  spring.datasource.url=jdbc:h2:mem:mojec
  spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
  spring.jpa.hibernate.ddl-auto=update
  spring.datasource.data=classpath:data.sql

它讓我擔心。

您的請求映射需要像這樣指定 httpmethod:

@RequestMapping(value= "/users", method=RequestMethod.GET)

RestController從未由 Spring 配置,因為 Spring Boot 的組件掃描無法檢測到它(事實上,您的其他 bean 類也沒有被掃描)。 這里的問題是你有一個像這樣的 package 結構:

com.Wallet
  - WalletApplication.java
com.Controller
  - UserController.java
com.Service
  - UserAccountServiceImpl.java

Now since, the mainClass is in package com.Wallet it would scan for bean definitions inside that package (or a sub-package in com.Wallet ). 所以:

  • 要么你移動所有的包,比如com.Controllercom.ServiceImpl等在com.Wallet里面
com.Wallet
   |
   |- WalletApplication.java
   |
   |- Controller
   |  |
   |  |- UserController.java
   | 
   |- Service
      |
      |- UserAccountServiceImpl.java
  • 或者,在您的主要 class 中使用@ComponentScan -
@EnableJpaRepositories
@SpringBootApplication
@ComponentScan(basePackages = { "com.Controller", "com.ServiceImpl", .. })
public class WalletApplication {

    public static void main(String[] args) {
        SpringApplication.run(WalletApplication.class, args);
    }
}

我建議第一個選項,因為它為您的應用程序提供了一個更干凈的 package 結構。

您首先需要檢查 package 結構。 for example if the main class is in com.example, others classes will follow com.example.controller, com.example.model etc. @ComponentScan will scan the base packages after com.example..

不要直接從 controller 訪問接口。 通過服務層訪問它。

您應該創建一個服務實例 class 而不是接口 class。

改變

     @Autowired
     UserAccountService userService;

    @Autowired
    UserAccountServiceImplementation userService;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM