![](/img/trans.png)
[英]Rest services always returning Error 401 with Postman but integration test are working
[英]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.Controller
, com.ServiceImpl
等在com.Wallet
里面com.Wallet
|
|- WalletApplication.java
|
|- Controller
| |
| |- UserController.java
|
|- Service
|
|- UserAccountServiceImpl.java
@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.