Loading...
lapd87 avatar lapd87 103 Точки

[Homework] Java Spring Auto Mapping - 01. Problem - Game Store

Привет,

моля някой ако може да погледне кода ми и да каже защо не ми работят валидаторите (говорим мейл и парола). Предполагам грешката е една и съща, но гледах видеото от упражненията на Иван, гледах и примерите от слидо не успявам да намеря разлика.

https://www.dropbox.com/s/j3kbushhp9p9xd4/_01GameStore.zip?dl=0

 

Весело прекарване на празника на всички :)

Тагове:
1
Module: Java DB
lapd87 avatar lapd87 103 Точки

Съжелявам ама пак нищо не разбрах от обясненията :)

пуснах си видеото от предния курс и на 1:48:00 откриха топлата вода. Имплементирах си го и след добавяне на депенданси проработи перфектно :)

<!-- https://mvnrepository.com/artifact/org.glassfish.web/el-impl -->
<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>el-impl</artifactId>
    <version>2.2</version>
</dependency>

в имплементацията на регистрирането след като наглася user правя валидацията и всичко е ок

user.setRole(role);

ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
Set<ConstraintViolation<User>> constraintViolations = validatorFactory.getValidator().validate(user);

if (!constraintViolations.isEmpty()) {
    for (ConstraintViolation<User> constraintViolation : constraintViolations) {
        System.out.println(IODelimiter + constraintViolation.getMessage());
    }

    return false;
}

this.userRepository
        .saveAndFlush(user);

return true;
1
lapd87 avatar lapd87 103 Точки

всичко хубаво си има край. Като сложих ограниченията за игрите и се получи следния проблем при нова игра

HV000030: No validator could be found for constraint 'javax.validation.constraints.Size' validating type 'java.lang.Double'. Check configuration for 'size'

като се сменяше на BigDecimal за цената и т.н.

хвърля ексепшъна при

Set<ConstraintViolation<Game>> constraintViolations = validatorFactory.getValidator().validate(game);

За целта оправих така:

@Size(min = 0, message = "Size must be positive")
@Column(nullable = false, scale = 1)

@Range(min = 0, message = "Price must be positive")
@Column(nullable = false, scale = 2)

сега гърми с 

javax.validation.ValidationException: HV000032: Unable to initialize softuni.gamestore.model.validators.TrailerCheckValidator.

не ми е ясно какво се случва....

Идеи?

Ето проекта към момента

https://www.dropbox.com/s/j3kbushhp9p9xd4/_01GameStore.zip?dl=0

 

Edit:

Видях че имам проблем с регекса на трейлъра и го оправих:

return trailer.matches("^\\w{11}$");

освен това оправих логиката при добавяне и редактиране на игра да поема цял линк и само края:

String[] trailerInput = inputArgs[4].split("=",2);

String trailer = trailerInput[0];
if (trailerInput.length > 1) {
    trailer = trailerInput[1];
}

но все още грешката е същата...

Видях че от копи-пейст е останало в трейлъра на заглавието класовете... тъпо ама го оправих и него

сега пак се връщаме на грешките с Double...

малко гугъл и ето това е решението за големина и цена:

@DecimalMin(value = "0.0", inclusive = true, message = "Price must be positive")

 

Весел празник ето линка на оправената задача :) Благодаря отново на всички отзовали се, без вас нямаше да успея :)

https://www.dropbox.com/s/j3kbushhp9p9xd4/_01GameStore.zip?dl=0

2
08/04/2018 14:17:34
MartinBG avatar MartinBG 4803 Точки

Опитваш се да изпълниш условието за прецизност (символи след десетичната зашетая) за цена и размер, предполагам. :)

Тука има няколко подхода, които могат да се разделят най-общо на две групи:

А. Валидация на входните данни

Б. Валидация на ниво ентити + сетване на колоните в таблиците на базата с желаната прецизност

В. Комбинация между горните две

Входните данни може да се проверяват на няколко места: при прочитането, при конструирането на DTO, при подаването за запис към базата. Най-смислено, според мен, в този случай е проверката да бъде в DTO, като всякакви грешки, открити там се връщат към потребителя.

Системата ще работи и при правилно създадено ентити с валидация на всяко поле - това е най-лесно за реализация и като цяло не е лоша идея да го има, дори и да правим валидацията на други нива (един вид застраховка, ако някой опита да persist-не обект, създаден по нестандартен начин).

По-трудно е за поддръжка, но това може да се адресира, ако си направим анотации за проверка на всяко поле и използваме само и единствено тях на всяко от нивата в програмата ни (напр. @Password, @Email, @URL и т.н., които да ползваме както за entity, така и за dto). 

 

Относно задаването на прецизност за числата в базата през Hibernate, аз знам за 2 начина:

1. Използване BigDecimal тип в entiti-то и към него подбна анотация: @Column(precision = 10, scale = 1)

2. Сетване на типа директно чрез анотация, като това работи и за float/double, но не е добра идея, защото е един вид хардкодване и може да не работи на друга база : @Column(columnDefinition = "DOUBLE(10,1)")

2
lapd87 avatar lapd87 103 Точки

Благодаря че го видя

@Digits(integer = 20, fraction = 1, message = "Invalid size format")

добавих това :) мисля че е най-лесно

1
jameslite avatar jameslite 1 Точки

Nice Homework.

0
18/04/2020 20:32:22
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.