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 对象。 希望这有效