0
点赞
收藏
分享

微信扫一扫

返回Json时多了一对中括号,关于可变参数和简单问题思考


今天写接口返回JSON数据时,遇到一个问题,是这样的,下面是代码示例,基于SpringData JPA

一、自己封装的ResultBean,用于接收数据,响应给前端

package tonels.common;

import lombok.Data;

@Data
public class ResultBean {

private String code;

private String msg;

private Object result;

// 这个注解是后来的解决方案,先不打开,
// public ResultBean(String code, String msg, Object result) {
// this.code = code;
// this.msg = msg;
// this.result = result;
// }

public ResultBean(String code, String msg, Object... result) {
this.code = code;
this.msg = msg;
this.result = result;
}

public ResultBean(String code, String msg) {
this.code = code;
this.msg = msg;
}

public static ResultBean ok(){
return new ResultBean("200","成功");
}

public static ResultBean ok(Object result){
return new ResultBean("200","成功",result);
}

public static ResultBean ok(Object r1,Object r2,Object r3){
return new ResultBean("200","成功",r1,r2,r3);
}

public static ResultBean error(){
return new ResultBean("000", "失败");
}

public static ResultBean error(String msg){
return new ResultBean("000", msg);
}

public static ResultBean error(String code, String msg){
return new ResultBean(code, msg);
}

}

二、这是Model定义

package tonels.model;

import lombok.Data;
import lombok.experimental.Accessors;

import javax.persistence.*;
import java.math.BigDecimal;

@Accessors(chain = true)
@Data
@Entity
@Table(name = "customers", schema = "classicmodels", catalog = "")
public class CustomersEntity {

@Id
@Column(name = "customerNumber")
private Integer customerNumber;

@Column(name = "customerName")
private String customerName;

@Column(name = "contactLastName")
private String contactLastName;

@Column(name = "contactFirstName")
private String contactFirstName;

@Column(name = "phone")
private String phone;

@Column(name = "addressLine1")
private String addressLine1;

@Column(name = "addressLine2")
private String addressLine2;

@Column(name = "city")
private String city;

@Column(name = "state")
private String state;

@Column(name = "postalCode")
private String postalCode;

@Column(name = "country")
private String country;

@Column(name = "salesRepEmployeeNumber")
private Integer salesRepEmployeeNumber;

@Column(name = "creditLimit")
private BigDecimal creditLimit;

}

三、这是controller层

package tonels.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import tonels.common.ResultBean;
import tonels.service.CustomerService;

import javax.annotation.Resource;

@RestController
@RequestMapping("/customers")
public class CustomerController {

@Resource
private CustomerService customerService;

@GetMapping("/findById")
public ResultBean getS1(Integer id){
return ResultBean.ok(customerService.findById(id));
}


}

四、这是Service层

这是基础的Service,提供所有业务的service的公共方法,所有业务需要继承这个Service接口

package tonels.service;

import org.springframework.data.domain.Page;

import java.util.List;
import java.util.Set;

// V是对象,K是主键
public interface BaseService<T,K> {

boolean doCreate(T vo);

boolean doUpdate(T vo);

boolean doRemove(Set<K> ids);

T findById(K id);

List<T> findAll();

Page<T> findPages();

List<T> findAllSplit(String column,String keyword,Integer page,Integer rows);

Integer getCount(String column,String keyword);



}

package tonels.service;

import tonels.model.CustomersEntity;

public interface CustomerService extends BaseService<CustomersEntity,Integer>{


}

五、这是实现类

package tonels.service.impl;

import cn.hutool.json.JSONUtil;
import com.google.common.collect.Lists;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tonels.model.CustomersEntity;
import tonels.repository.CustomerRepo;
import tonels.service.CustomerService;
import tonels.vo.mysqlVo.*;

import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;

@Service
@Transactional
public class CustomerImpl implements CustomerService {

@Resource
private CustomerRepo customerRepo;

@Override
public List<CustomersEntity> findAll() {
return customerRepo.findAll();
}

}

@Override
public List<CustomersVo31> hsql_31() {
// return customerRepo.findOrdersByCust_hsql31();
return null;
}

@Override
public List<CustomersVo32> hsql_32() {
return customerRepo.findOrdersByCust_hsql32();
}

@Override
public List<CustoAndOrder> hsql_4() {
// return customerRepo.findOrdersByCust_hsql4();
return null;
}

@Override
public boolean doCreate(CustomersEntity vo) {
return false;
}

@Override
public boolean doUpdate(CustomersEntity vo) {
return false;
}

@Override
public boolean doRemove(Set<Integer> ids) {
return false;
}

@Override
public CustomersEntity findById(Integer id) {
Optional<CustomersEntity> byId = customerRepo.findById(id);
return byId.orElse(null); // 函数式编码方式
}

@Override
public List<CustomersEntity> findAllSplit(String column, String keyword, Integer page, Integer rows) {
return null;
}

@Override
public Integer getCount(String column, String keyword) {
return null;
}

@Override
public Page<CustomersEntity> findPages() {
return null;
}
}

六、Repository层

package tonels.repository;

import java.util.List;
import java.util.Map;

public interface CustomerRepo extends BaseRepository<CustomersEntity,Integer> {


}

// 需新建包

package tonels.repository;

@NoRepositoryBean
public interface BaseRepository<T,K> extends JpaRepository<T, K>,JpaSpecificationExecutor<T>{
}

七、项目启动,访问localhost:1210/customers/findByid?id=103,下面是返回数据

{
"code": "200",
"msg": "成功",
"result": [
{
"customerNumber": 103,
"customerName": "Atelier graphique",
"contactLastName": "Schmitt",
"contactFirstName": "Carine ",
"phone": "40.32.2555",
"addressLine1": "54, rue Royale",
"addressLine2": null,
"city": "Nantes",
"state": null,
"postalCode": "44000",
"country": "France",
"salesRepEmployeeNumber": 1370,
"creditLimit": 21000
}
]
}

注意到实际返回的单个对象被 中括号[ ]包裹起来了,会造成前端取数据的不方便,原因是ResultBean封装的问题,那个可变参数构造函数问题,把注释部分解开,即可返回正确数据

{
"code": "200",
"msg": "成功",
"result": {
"customerNumber": 103,
"customerName": "Atelier graphique",
"contactLastName": "Schmitt",
"contactFirstName": "Carine ",
"phone": "40.32.2555",
"addressLine1": "54, rue Royale",
"addressLine2": null,
"city": "Nantes",
"state": null,
"postalCode": "44000",
"country": "France",
"salesRepEmployeeNumber": 1370,
"creditLimit": 21000
}
}

代码简单,但是结构和包较多,可能会出现少依赖和配置错误的问题,这里不详细介绍了

举报

相关推荐

0 条评论