#spring-boot #kotlin #jpa
Вопрос:
Я перепробовал все со своего сайта, но за последние 4 дня не смог решить эту проблему.
Caused by: org.springframework.data.mapping.PropertyReferenceException: No property id found for type UserRegistration!
Я использую jpa и springboot в своем приложении, но я не знаю, почему сталкиваюсь
с такой проблемой
Caused by: org.springframework.data.mapping.PropertyReferenceException: No property id found for type UserRegistration!
at org.springframework.data.mapping.PropertyPath.<init>(PropertyPath.java:90) ~[spring-data-commons-2.5.1.jar:2.5.1]
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:437) ~[spring-data-commons-2.5.1.jar:2.5.1]
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:413) ~[spring-data-commons-2.5.1.jar:2.5.1]
at org.springframework.data.mapping.PropertyPath.lambda$from$0(PropertyPath.java:366) ~[spring-data-commons-2.5.1.jar:2.5.1]
at java.base/java.util.concurrent.ConcurrentMap.computeIfAbsent(ConcurrentMap.java:330) ~[na:na]
at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:348) ~[spring-data-commons-2.5.1.jar:2.5.1]
at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:331) ~[spring-data-commons-2.5.1.jar:2.5.1]
at org.springframework.data.repository.query.parser.Part.<init>(Part.java:81) ~[spring-data-commons-2.5.1.jar:2.5.1]
at org.springframework.data.repository.query.parser.PartTree$OrPart.lambda$new$0(PartTree.java:249) ~[spring-data-commons-2.5.1.jar:2.5.1]
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195) ~[na:na]
at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:177) ~[na:na]
at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) ~[na:na]
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:na]
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578) ~[na:na]
at org.springframework.data.repository.query.parser.PartTree$OrPart.<init>(PartTree.java:250) ~[spring-data-commons-2.5.1.jar:2.5.1]
at org.springframework.data.repository.query.parser.PartTree$Predicate.lambda$new$0(PartTree.java:383) ~[spring-data-commons-2.5.1.jar:2.5.1]
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195) ~[na:na]
at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:177) ~[na:na]
at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) ~[na:na]
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:na]
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578) ~[na:na]
at org.springframework.data.repository.query.parser.PartTree$Predicate.<init>(PartTree.java:384) ~[spring-data-commons-2.5.1.jar:2.5.1]
at org.springframework.data.repository.query.parser.PartTree.<init>(PartTree.java:95) ~[spring-data-commons-2.5.1.jar:2.5.1]
at org.springframework.data.jpa.repository.query.PartTreeJpaQuery.<init>(PartTreeJpaQuery.java:89) ~[spring-data-jpa-2.5.1.jar:2.5.1]
... 70 common frames omitted
Я использую пользовательский запрос в своем файле репозитория
Регистрация пользователя.кт
package com.userservice.userregistration.entity
import javax.persistence.Entity
import javax.persistence.GeneratedValue
import javax.persistence.GenerationType
import javax.persistence.Id
@Entity
data class UserRegistration(
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
val userId:Long=-1,
val firstName:String="",
val lastName:String="",
val email:String="",
val departmentId:Long=-1,
)
Регистрация пользователей.kt
package com.userservice.userregistration.repository
import com.userservice.userregistration.entity.UserRegistration
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.stereotype.Repository
@Repository
interface UserRegistrationRepository : JpaRepository<UserRegistration,Long> {
fun findUserById(userId: Long?): UserRegistration?
}
UserRegistrationService.kt
package com.userservice.userregistration.service
import com.userservice.userregistration.VO.Department
import com.userservice.userregistration.VO.ResponseTemplateVO
import com.userservice.userregistration.entity.UserRegistration
import com.userservice.userregistration.repository.UserRegistrationRepository
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service
import org.springframework.web.client.RestTemplate
@Service
class UserRegistrationService {
@Autowired
private lateinit var userRegistrationRepository: UserRegistrationRepository
@Autowired
private lateinit var restTemplate: RestTemplate
fun saveUserDetails(userRegistration: UserRegistration): UserRegistration {
return userRegistrationRepository.save(userRegistration)
}
fun getUserWithDepartment(userId: Long): ResponseTemplateVO {
val vo= ResponseTemplateVO()
val userRegistration:UserRegistration? = userRegistrationRepository.findUserById(userId)
val department: Department? =
restTemplate.getForObject("http://localhost:9001/departments/" userRegistration?.departmentId,
Department::class.java)
vo.userRegistration=userRegistration
if (department != null) {
vo.department=department
}
return vo
}
}
UserRegistrationController.kt
package com.userservice.userregistration.controller
import com.userservice.userregistration.VO.ResponseTemplateVO
import com.userservice.userregistration.entity.UserRegistration
import com.userservice.userregistration.service.UserRegistrationService
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.web.bind.annotation.*
@RestController
@RequestMapping("/users")
class UserRegistrationController {
@Autowired
private lateinit var userRegistrationService: UserRegistrationService
@PostMapping("/")
fun saveUserDetails(@ModelAttribute userRegistration:UserRegistration):UserRegistration{
return userRegistrationService.saveUserDetails(userRegistration)
}
@GetMapping("/{id}")
fun getUserWithDepartment(@PathVariable("id") userId:Long):ResponseTemplateVO{
return userRegistrationService.getUserWithDepartment(userId)
}
}
Если я не использую пользовательский запрос в своем репозитории, он покажет мне другую проблему
«обязательная регистрация пользователя найдена необязательной» в моем
классе службы регистрации пользователей
Комментарии:
1. Ошибка точно говорит вам, что не так. У вашего
User
нет свойства с именемid
, которое у него есть на имениuserId
. Просто используйте обычныйfindById
и просто обработайтеOptional
(используйтеsomething like
orElseThrow(() -> новое исключение IllegalStateException(«Пользователь не найден»)l`, которое вызовет исключение, если пользователь не найден, иначе оно вернет запись.
Ответ №1:
просто переоденься
@Repository
interface UserRegistrationRepository : JpaRepository<UserRegistration,Long> {
fun findUserById(userId: Long?): UserRegistration?
}
в
@Repository
interface UserRegistrationRepository : JpaRepository<UserRegistration,Long> {
fun findUserByUserId(userId: Long?): UserRegistration?
}
Ответ №2:
Вам не нужно объявлять отдельный метод запроса для поиска по идентификатору, вы можете просто добавить @Column
аннотацию для id
своего свойства.
@Id
@Column("user_id") // or whatever it's called in the SQL table
@GeneratedValue(strategy = GenerationType.AUTO)
val userId:Long=-1
а затем используйте стандартный метод ( Optional<T> findById(ID id);
), унаследованный от JpaRepository
val userRegistration:UserRegistration? =
userRegistrationRepository.findById(userId).orElse(null)