如何在 springboot 中构建微服务 GET api,它可以将单个或多个参数作为插入请求 url 并获取数据作为请



GET/data/search?将返回所有记录

GET/data/search?name=jhon&add=US将根据请求返回特定记录

GET/data/search? Amount=100将返回特定于金额 100 的所有记录

客户可以根据自己的要求输入全部或部分参数。

任何指向参考代码的链接也可以

下面是我的错误和实现

在我的 repo 方法没有被调用的地方,它正在调用服务方法并打印控制器和服务的系统,而不是 repo 的系统,这意味着它没有调用 repo 下面是 consol 输出: 收到的请求参数(系统输出(

内部服务方法(系统输出(

2019-10-15 13:54:30,185 错误 [http-nio-8080-exec-1] org.apache.juli.logging.DirectJDKLog: Servlet.service(( for servlet [dispatcherServlet] 在路径 [] 的上下文中抛出了异常 [请求处理失败;嵌套异常是 java.lang.NullPointerException] 与根本原因 java.lang.NullPointerException: null

@RestController
public class MobileController {

@GetMapping(value="/mobile/search")
public List<MobileResponse> getMobile(@RequestParam Map<String, String> 
map) {
MobileService mobileService =new MobileService();
System.out.println("Request param received");
map.forEach((k,v)->System.out.println(k+":"+v));
List<MobileResponse> mobiles = mobileService.getAllMobiles(map);
mobiles.forEach(mobile-> System.out.println(mobile));
return mobiles;
}
}

服务

@Service
public class MobileService {

public List<MobileResponse> getAllMobiles(Map<String, String> map) {
List<MobileResponse> mobilResponseList = new ArrayList<>();
System.out.println("Inside service method");
MobileRepoIntf repo=null;
mobilResponseList  = repo.findAllMobiles(map);
return mobilResponseList;
}
}

存储库接口

@Repository
public interface MobileRepoIntf{

List<MobileResponse> findAllMobiles(Map<String, String> map);
}

回购影响

public class MobileRepository implements MobileRepoIntf {
@PersistenceContext
private EntityManager em;
@SuppressWarnings("uncheaked")
@Override
public List<MobileResponse> findAllMobiles(Map<String, String> map) {
System.out.println("inside Repo method ");
String query = "select m.id,h.id, r.id from 
com.axiomtelecom.assignment.entities.Mobile m, 
com.axiomtelecom.assignment.entities.Hardware 
h,com.axiomtelecom.assignment.entities.Releases r where m.hardware_id = 
h.id AND m.releases_id = r.id";
List<MobileResponse> mobileList = new ArrayList();
Query qry = em.createQuery(query);
System.out.println("Query is "+qry);
return qry.getResultList();
}
}

移动实体

@Entity
@Table(name = "MOBILE")
public class Mobile implements Serializable {
//Logger logger = (Logger) LoggerFactory.getLogger(Mobile.class);
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(name = "brand")
private String brand;
@Column(name = "phone")
private String phone;
@Column(name = "picture")
private String picture;
@Column(name = "sim")
private String sim;
@Column(name = "resolution")
private String resolution;

//@OneToOne(cascade = CascadeType.ALL)
@OneToOne
@JoinColumn(name ="id")
private Hardware hardware;
@OneToOne
@JoinColumn(name="id")
private Releases releases;
//followed by setter and getter methods
}

硬件实体

@Entity
@Table(name="Hardware")
public class Hardware implements Serializable {
//Logger logger = (Logger) LoggerFactory.getLogger(Hardware.class);
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(name="audioJacks")
private String audioJacks;
@Column(name = "gps")
private String gps;

@Column(name = "battery")
private String battery;
//followed by setter and getter methods
}

发布实体

@Entity
@Table(name="Releases")
public class Releases implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(name="priceEuro")
private long priceEuro;
@Column(name="announceDate")
private String announceDate;
//followed by setter and getter methods
}

数据.sql文件

enter code here
drop table if exists Hardware;
CREATE table  Hardware (
id INT AUTO_INCREMENT  PRIMARY KEY,
audioJacks varchar(200),
gps varchar(100),
battery varchar(200),
);

drop table if exists Releases;
create table If Not exists Releases (
id INT AUTO_INCREMENT  PRIMARY KEY,
priceEuro int,
announceDate varchar(100),
);
drop table if exists Mobile;
CREATE TABLE If Not exists   Mobile (
id INT AUTO_INCREMENT  PRIMARY KEY,
brand VARCHAR(250),
phone VARCHAR(250),
picture VARCHAR(250),
sim VARCHAR(250),
resolution VARCHAR(250),
hardware_id int references Hardware(id),
releases_id int references Releases(id)
);
//followed by insert query first for releases,hardware and then for mobile 
data is inserted as expected in db.

有多种方法可以实现它。

您可以将每个查询参数作为方法参数接收:

@GetMapping("/foo")
public ResponseEntity<Foo> getFoo(@RequestParam(value = "name", required = false) String name,
@RequestParam(value = "amount", required = false) Integer amount) {
...
}

您可以接收所有参数作为Map<String, String>

@GetMapping("/foo")
public ResponseEntity<Foo> getFoo(@RequestParam Map<String, String> parameters) {   
...
}

或者,您可以定义一个用于表示参数的类,并接收它作为方法参数的 instace:

@Data
public class FooQueryParameters {
private String name;
private Integer amount;
}
@GetMapping("/foo")
public ResponseEntity<Foo> getFoo(FooQueryParameters parameters) {   
...
}

它应该是这样的:

@GetMapping("/data/search")
public YourObject getData(@RequestParam(value = "name", required = false) String name, 
@RequestParam(value = "amount", required = false) Integer amount){
...
}

最新更新