Convert/map 将日期(日、月、年)输入 java.time.LocalDate
Convert/map inputs of date (day, month, year) into java.time.LocalDate
这是我们在界面中的内容:
我粘贴了我认为相关的部分代码,但可能还需要更多内容。
工作原理
按下按钮时,将调用 userController.js 保存方法。 controller中有一个$resource,$save方法是"connected",create方法是UserController.java,还有persisted.
问题
在界面中,我有三个输入(dd、mm、yy),我想要保留的是一个带有 java.time.LocalDate 的用户。 我应该如何以及在何处对这三个输入进行 map/transformation 转换,然后在 LocalDate 中进行转换? 因为很明显,用户在 .js 中的定义方式是.java 中的定义不同。
在前端
user.html
<div class="form-group">
<label class="col-sm-2 control-label">Date of Birth</label>
<div class="col-sm-10">
<div class="form-inline">
<div class="form-group">
<label class="sr-only" for="txt_day">Enter Day</label>
<div class="col-sm-2">
<input type="text" id="txt_day" ng-model="user.birthdate.day" class="form-control" placeholder="DD" required maxlength="2"
data-validation-required-message="Day is required">
</div>
</div>
<div class="form-group">
<label class="sr-only" for="txt_month">Enter Month</label>
<div class="col-sm-2">
<input type="text" id="txt_month" ng-model="user.birthdate.month" class="form-control" placeholder="MM" required
maxlength="2" data-validation-required-message="Month is required">
</div>
</div>
<div class="form-group">
<label class="sr-only" for="txt_year">Enter Year</label>
<div class="col-sm-2 ">
<input type="text" id="txt_year" ng-model="user.birthdate.year" class="form-control" placeholder="YY" required
maxlength="4" data-validation-required-message="Year is required">
</div>
</div>
</div>
</div>
</div>
userController.js
$scope.user = new UserService();
$scope.save = function() {
$scope.user.$save(function() {
$location.path('/');
});
};
UserService.js
return $resource('rest/user/:action', {},....
在后端
UserController.java
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public User create(User user) {
LOGGER.info("create(): " + user);
return this.userDao.save(user);;
}
实体
@Column(nullable = false)
@Convert(converter = LocalDatePersistenceConverter.class)
private LocalDate birthDate;
老实说,我看到您的应用程序通过休息服务将您的域实体暴露给外部。为了确保关注点分离原则,我不建议这样做。您现在遇到的这个问题就是因为这个。如果在您的应用程序中添加 services/dto 层有点麻烦,一种解决方法可能是:
@Entity
public class User{
@Column(nullable = false)
@Convert(converter = LocalDatePersistenceConverter.class)
private LocalDate birthDate;
@Transient
private birthDay
@Transient
private birthMonth
@Transient
private birth birthYear
..
@PrePersist
protected void prePersist()
{
birthDate = new LocalDate(birthDay, birthMonth, birthYear)
}
}
所以您的实体是从您的 javascript 组件填充的,并且 jpa 提供程序进行调整以创建一个 jodatime 对象。
希望这有效
这是我们在界面中的内容:
我粘贴了我认为相关的部分代码,但可能还需要更多内容。
工作原理
按下按钮时,将调用 userController.js 保存方法。 controller中有一个$resource,$save方法是"connected",create方法是UserController.java,还有persisted.
问题
在界面中,我有三个输入(dd、mm、yy),我想要保留的是一个带有 java.time.LocalDate 的用户。 我应该如何以及在何处对这三个输入进行 map/transformation 转换,然后在 LocalDate 中进行转换? 因为很明显,用户在 .js 中的定义方式是.java 中的定义不同。
在前端
user.html
<div class="form-group">
<label class="col-sm-2 control-label">Date of Birth</label>
<div class="col-sm-10">
<div class="form-inline">
<div class="form-group">
<label class="sr-only" for="txt_day">Enter Day</label>
<div class="col-sm-2">
<input type="text" id="txt_day" ng-model="user.birthdate.day" class="form-control" placeholder="DD" required maxlength="2"
data-validation-required-message="Day is required">
</div>
</div>
<div class="form-group">
<label class="sr-only" for="txt_month">Enter Month</label>
<div class="col-sm-2">
<input type="text" id="txt_month" ng-model="user.birthdate.month" class="form-control" placeholder="MM" required
maxlength="2" data-validation-required-message="Month is required">
</div>
</div>
<div class="form-group">
<label class="sr-only" for="txt_year">Enter Year</label>
<div class="col-sm-2 ">
<input type="text" id="txt_year" ng-model="user.birthdate.year" class="form-control" placeholder="YY" required
maxlength="4" data-validation-required-message="Year is required">
</div>
</div>
</div>
</div>
</div>
userController.js
$scope.user = new UserService();
$scope.save = function() {
$scope.user.$save(function() {
$location.path('/');
});
};
UserService.js
return $resource('rest/user/:action', {},....
在后端
UserController.java
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public User create(User user) {
LOGGER.info("create(): " + user);
return this.userDao.save(user);;
}
实体
@Column(nullable = false)
@Convert(converter = LocalDatePersistenceConverter.class)
private LocalDate birthDate;
老实说,我看到您的应用程序通过休息服务将您的域实体暴露给外部。为了确保关注点分离原则,我不建议这样做。您现在遇到的这个问题就是因为这个。如果在您的应用程序中添加 services/dto 层有点麻烦,一种解决方法可能是:
@Entity
public class User{
@Column(nullable = false)
@Convert(converter = LocalDatePersistenceConverter.class)
private LocalDate birthDate;
@Transient
private birthDay
@Transient
private birthMonth
@Transient
private birth birthYear
..
@PrePersist
protected void prePersist()
{
birthDate = new LocalDate(birthDay, birthMonth, birthYear)
}
}
所以您的实体是从您的 javascript 组件填充的,并且 jpa 提供程序进行调整以创建一个 jodatime 对象。 希望这有效