(二)消费者和生产者远程调用接口定义 注:在写下面代码之前,请先完成上面的操作 1.在生产者nacos_provider模块中先定义一个user实体类
package com.provider.code.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
@AllArgsConstructor
@NoArgsConstructor
@Data
@Accessors(chain = true)
public class User {
private String account;
private String password;
}
2.在controller中定义请求方法
package com.provider.code.controller;
import com.provider.code.pojo.User;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
@RestController
@RequestMapping("/user")
public class UserController {
//路径传参
@RequestMapping("/{account}")
private String getByPath(@PathVariable String account){
System.out.println("account路径传参效果:"+account);
return "provider say: yes";
}
//请求直接携带
@RequestMapping("/param")
private String getByParam(@RequestParam("account") String account,@RequestParam("password") String password){
System.out.println("请求直接携带account:"+account+"password:"+password);
return "provider say: yes";
}
//直接携带对象,json的格式
@RequestMapping("/pojo")
private String getByPojo(@RequestBody User user){
System.out.println("直接携带对象pojo:"+user);
return "provider say: yes";
}
//map集合,json的格式
@RequestMapping("/more")
private String getByMore(@RequestBody Map map){
System.out.println("map集合more:"+map);
return "provider say: yes";
}
}
注:控制台输出效果如下
注:传输json格式的方法,需要在Body中,手动用json格式写入要传输的参数和数值
(三)Feign远程调用 1.在父类的pom.xml中导入远程通信的依赖
2.在nacos_consumer消费者模块中写入实体类和service层方法org.springframework.cloud spring-cloud-starter-openfeign
package com.consumer.code.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
@AllArgsConstructor
@NoArgsConstructor
@Data
@Accessors(chain = true)
public class User {
private String account;
private String password;
}
package com.consumer.code.service;
import org.apache.catalina.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
@FeignClient("provider")
public interface FeignUserService {
@RequestMapping("/user/{account}")
String getByPath(@PathVariable String account);
@RequestMapping("/user/param")
String getByParam(@RequestParam("account") String account,@RequestParam("password") String password);
@RequestMapping("/user/pojo")
String getByPojo(@RequestBody User user);
@RequestMapping("/user/more")
String getByMore(@RequestBody Map map);
}
3.在消费者启动类中加上@EnableFeignClients注解,开启Feign功能
4.在nacos_consumer消费者模块中新建controller类,写入远程访问的方法
package com.consumer.code.controller;
import com.consumer.code.pojo.User;
import com.consumer.code.service.FeignUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private FeignUserService service;
@RequestMapping("/test01")
public String test01(String account){
service.getByPath(account);
return "yes";
}
@RequestMapping("/{account}")
public String test02(@PathVariable String account){
service.getByPath(account);
return "yes";
}
@RequestMapping("/test03")
public String test03(String account,String password){
service.getByParam(account,password);
return "yes";
}
@RequestMapping("/test04")
public String test04(String account,String password){
service.getByPojo(new User().setAccount(account).setPassword(password));
return "yes";
}
@RequestMapping("/test05")
public String test05(String account,String password){
Map map =new HashMap<>();
map.put("account",account);
map.put("password",password);
service.getByMore(map);
return "yes";
}
}
注:开启生产者和消费者启动类,运行效果如下
(四)DTO构建
1.新建一个SpringBoot项目,作为公共的启动器,用来存放公共的代码
2.在commons启动器的pom.xml中引入lombok的依赖
注:记得把test的依赖删掉
3.把启动器模块打成架包org.projectlombok lombok
4.把启动类的依赖写入到父模块中 在父模块中引入启动器这个模块
注:不需要在启动器模块中继承父模块
5.可以把消费者中的实体类删除掉,然后把user对象该成调用userDto对象 运行效果如下: 注:问题1,如果dto实体中的属性,和消费者中的实体对象一致,可以使用以下方法去数据库中拿到对应的属性com.colude02 code0.0.1-SNAPSHOT
问题2:如果dto里面的名字和实体里面的名字不一致,可以使用第二种方法进行修改
注:1.使用第二中方法之前需要先在消费者模块的pom.xml导入下面的依赖
org.springframework.cloud spring-cloud-loadbalancer
2.在生产者模块的启动类中写入一个方法MapperFactory的方法,再加上@Scope(prototype)注解
注:记得在UserContoler中注入MapperFactory
使用场景(如果对象中属性太多,普通逻辑处理代码太多)
- A对象复制到B对象(对象复制)
//业务场景,将A对象复制B对象中
//1.普通逻辑处理
User A = new User().setId("123").setName("1231");
UserVo B = new UserVo().setId(A.getId()).setName(A.getName());
System.out.println("普通方式将A对象复制B对象中:"+B);
//使用orika复制工具将A复制到B对象中
MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
UserVo map = mapperFactory.getMapperFacade().map(A, UserVo.class);
System.out.println("orika复制对象:"+map);
由上得出控制台输出如下:
普通方式将A对象复制B对象中:UserVo(id=123, name=1231) orika复制对象:UserVo(id=123, name=1231)
2.A集合复制到B集合(集合复制)
//1.普通逻辑处 //A对象 ListA = Arrays.asList(new User().setId("123").setName("张三")); //B对象 List B = new ArrayList<>(); //将A集合数据复制到B集合中 A.forEach(x->{ B.add( new UserVo().setId(x.getId()).setName(x.getName())); }); System.out.println("将A集合中数据set到B集合中数据打印"); //使用orika复制工具将A集合复制到B集合中 MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build(); List userVo = mapperFactory.getMapperFacade().mapAsList mapperFactory.getMapperFacade().mapAsList(A, UserVo.class); System.out.println("orika直接复制对象集合打印结果:"+userVo);
由上得出控制台输出如下:
将A集合中数据set到B集合中数据打印:[UserVo(id=123, name=张三)]` `orika直接复制对象集合打印结果:[UserVo(id=123, name=张三)]`
到此为止您已经算入门了,以上是Orika的基础使用,由此发现如果对象中属性如果20个,那么用普通的逻辑处理需要20个set过去,如果用Orika两行代码搞定。话不多说关键步骤总结一波(关键必须牢记):
MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build(); mapperFactory.getMapperFacade().map(操作对象) mapperFactory.getMapperFacade().mapAsList(操作集合对象)



