对于用于接收对方传入数据的接口,如接收用的WebService 服务接口,其需要在收到请求时报出完整的入参报文,如果报错,则需要确保即使程序抛出异常仍可正常返回错误提示给到对方;且对于需要插入对方传入的报文内容时,需要确保即使传入多个内容时,其中某个内容入库失败导致没有插入,也不会影响接下来或其他内容的插入。
@Override
public String receiveFromInterface(String webServiceString) {
// 将WebService 的请求打印输出到控制台
log.info("" + webServiceString);
try {
// 解析WebService 请求...
...
//
for (int i = 0; i < 99; i++) {
try {
// 在for 循环中包裹try 语句,防止插入多条数据时其中一条报错导致剩余需要执行入库循环的语句停止执行
insertIntoDatabase();
} catch (Exception e) {} finally {
}
}
} catch (Exception e) finally {
log.info("complete");
}
}
尽管多个接口使用相同的入参出参报文,如果只是内容不同,但外围参数一模一样,那么外围参数可以考虑使用Lombok 的@Builder 建造者模式注解来构建这些对象;但如果一个类与另一个有继承关系,则不要使用@Builder 注解,原因当当前的类继承父类时,而此时你又想将值同时赋给父类中的某个属性和子类中的某个属性,那么子类对象的@Builder 注解只能设置子类中的属性,而不能设置到父类中的属性,只能使用new关键字新建一个对象后手动设置父类和子类的属性来达到效果。所以并非任何地方都适用Builder模式,不要到处用。
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class AClass extends CommonRequestB {
private String name;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class CommonRequestB {
private int version;
}
/**
* 测试接口
*/
@RestController
@RequestMapping("/test")
public class AppUse {
@GetMapping("/t1")
public void interfaceTest() {
AClass obj = AClass.builder().name("张三")
.version(10) // 实际代码中设置不了version,即使该属性为public 修饰也无法使用builder 方法设置值
.build();
}
}