[英]how to make grpc proto "timestamp" change to Date input format?
我想讓時間戳轉換為Date
,但我期望輸入Date
格式,“NOT”秒和納米。 如何將其更改為日期格式輸入?
@GrpcService
public class ProductGRPCserver extends ProductServiceImplBase {
@Autowired
private ProductServiceImpl productServiceImpl;
public static Date getDateFromTimestamp(Timestamp timestamp) {
return new Date(Timestamps.toMillis(timestamp));
}
@Override
public void insert(Product request, StreamObserver<APIResponse> responseObserver) {
ProductEntity productEntity = new ProductEntity();
Date date = getDateFromTimestamp(request.getProductexpirationdate());
productEntity.setPurchase_item(request.getPurchaseItem());
productEntity.setProductname(request.getProductname());
productEntity.setProductbrand(request.getProductbrand());
productEntity.setProductprice(request.getProductprice());
productEntity.setProductdescription(request.getProductdescription());
productEntity.setProductquantity(request.getProductquantity());
productEntity.setProductexpirationdate(date);
System.out.println(date);
productServiceImpl.saveDataFromDTO(productEntity);
APIResponse.Builder responce = APIResponse.newBuilder();
responce.setResponseCode(0).setResponsemessage("Succefull added to database " + productEntity);
responseObserver.onNext(responce.build());
responseObserver.onCompleted();
}
為了獲得更有效的序列化和更具描述性的代碼,而不僅僅是一個字符串,您可以從 Google API 存儲庫復制Date的實現。 如果您只使用 Java,則只需復制以下內容:
syntax = "proto3";
package google.type;
option java_multiple_files = true;
option java_outer_classname = "DateProto";
option java_package = "com.google.type";
message Date {
int32 year = 1;
int32 month = 2;
int32 day = 3;
}
然后您將能夠導入:
import com.google.type.Date;
顯然,如果需要,您可以個性化package
和java_package
。 之后,這很簡單,您只需設置年、月和日期。
在此感謝我所做的。 我將 date.proto 導入到其他 proto 文件並將“String”從 date.proto @ClémentJean 更改為 Date這是照片更新
import "date.proto";
......
message Product {
int32 purchase_item = 1;
string productname = 2;
string productbrand = 3;
double productprice = 4;
string productdescription = 5;
int32 productquantity = 6;
.google.type.Date productexpirationdate = 7;
}
//convert to Date to make it compatible to a Entity Date
@GrpcService
public class ProductGRPCserver extends ProductServiceImplBase{
@Autowired
private ProductServiceImpl productServiceImpl;
//convert Date from date.proto to Java "Date".
public static Date getDateFromDateProto(com.google.type.Date date) {
Integer year = date.getYear();
Integer month = date.getMonth();
Integer days = date.getDay();
Calendar calendar = Calendar.getInstance();
calendar.clear();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, month);
calendar.set(Calendar.DATE, days);
Date datess = calendar.getTime();
return datess;
}
@Override
public void insert(Product request, StreamObserver<APIResponse> responseObserver) {
ProductEntity productEntity = new ProductEntity();
productEntity.setPurchase_item(request.getPurchaseItem());
productEntity.setProductname(request.getProductname());
productEntity.setProductbrand(request.getProductbrand());
productEntity.setProductprice(request.getProductprice());
productEntity.setProductdescription(request.getProductdescription());
productEntity.setProductquantity(request.getProductquantity());
//setProductexpirationdate is Date and getProductexpirationdate is customize Date proto to make is compatible. convert it
productEntity.setProductexpirationdate(getDateFromDateProto(request.getProductexpirationdate()));
productServiceImpl.saveDataFromDTO(productEntity);
APIResponse.Builder responce = APIResponse.newBuilder();
responce.setResponseCode(0).setResponsemessage("Succefull added to database " +productEntity);
responseObserver.onNext(responce.build());
responseObserver.onCompleted();
}
}
上面的代碼正在發送帶有轉換日期的數據。 現在檢索數據是上面相反的代碼,如下所示。
可以說,我調用 ProductEntity.class 方法“toProduct”,並將“Java Date”轉換為“proto Date”,這意味着它與發送數據相反。 您還可以使用方法“getDateFromDateProto”獲取數據庫中 1 行的數據,如 findbyid 並獲取 1 行中的數據這張圖片是檢索數據“列表”
import java.util.Calendar;
import java.util.Date;
import com.grpcserver.product.ProductServer.Product;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ProductEntity {
private Integer purchase_item;
private String productname;
private String productbrand;
private Double productprice;
private String productdescription;
private Integer productquantity;
private Date productexpirationdate;
public Product toProduct(){
return Product.newBuilder()
.setPurchaseItem(getPurchase_item())
.setProductname(getProductbrand())
.setProductbrand(getProductbrand())
.setProductprice(getProductprice())
.setProductdescription(getProductdescription())
.setProductquantity(getProductquantity())
.setProductexpirationdate(getDateFromDateProto(getProductexpirationdate()))
.build();
}
public static com.google.type.Date getDateFromDateProto(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
com.google.type.Date datess = com.google.type.Date.newBuilder().setYear(year).setMonth(month).setDay(day).build();
return datess ;
}
}
//get list
//"toProduct"
@Override
public void findAllRepeated(Product request, StreamObserver<ProductList> responseObserver) {
List<ProductDTO> list = productServiceImpl.getAllPpoduct();
List<Product> products = list.stream().map(ProductDTO::toProduct).collect(Collectors.toList());
ProductList productList = ProductList.newBuilder().addAllProduct(products)
.setResultCount(Int64Value.newBuilder().setValue(list.size()).build()).build();
responseObserver.onNext(productList);
responseObserver.onCompleted();
}
將其放入您的原型文件中:
message Date {
int32 year = 1;
int32 month = 2;
int32 day = 3;
}
然后你可以在你的原型文件中使用日期,例如:
message Customer {
string name = 1;
string address = 2;
Date birthDate = 3;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.