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){
...
}