• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zapętlenie wywołania w relacji OneToMany, Restowe API

Object Storage Arubacloud
0 głosów
149 wizyt
pytanie zadane 30 września 2019 w Java przez JuniorPL Użytkownik (770 p.)

Cześć, mam problem którego nie mogę rozwiązać. Stworzyłem relację jeden do wielu(jeden user wiele adresów). Kontroler Postowy działa poprawnie dodaje rekordy do tabel. Problem pojawia się przy Gecie. Co może być przyczyną.

 

User:

package com.example.entity;

import java.io.Serializable;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;

@Entity(name = "users")
public class UserEntity implements Serializable {

	private static final long serialVersionUID = -4652777307512175027L;

	@Id
	@GeneratedValue
	private long id;

	@Column(nullable = false)
	private String userId;

	@Column(nullable = false, length = 50)
	private String firstName;
	@Column(nullable = false, length = 50)
	private String lastName;
	@Column(nullable = false, length = 100,unique=true)
	private String email;

	private String password;
	@Column(nullable = false)
	private String encryptedPassword;
	private String emailVerificationToken;

	@Column(nullable = true, columnDefinition = "boolean default false")
	private Boolean emailVerificationStatus;

	
	@OneToMany(mappedBy="userDetails",cascade=CascadeType.ALL)
	private List<AddressEntity> addresses;
	
	
	public List<AddressEntity> getAddresses() {
		return addresses;
	}

	public void setAddresses(List<AddressEntity> addresses) {
		this.addresses = addresses;
	}

	public long getId() {
		return id;
	}

	public void setId(long id) {
		this.id = id;
	}

	public String getUserId() {
		return userId;
	}

	public void setUserId(String userId) {
		this.userId = userId;
	}

	public String getFirstName() {
		return firstName;
	}

	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}

	public String getLastName() {
		return lastName;
	}

	public void setLastName(String lastName) {
		this.lastName = lastName;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getEncryptedPassword() {
		return encryptedPassword;
	}

	public void setEncryptedPassword(String encryptedPassword) {
		this.encryptedPassword = encryptedPassword;
	}

	public String getEmailVerificationToken() {
		return emailVerificationToken;
	}

	public void setEmailVerificationToken(String emailVerificationToken) {
		this.emailVerificationToken = emailVerificationToken;
	}

	public Boolean getEmailVerificationStatus() {
		return emailVerificationStatus;
	}

	public void setEmailVerificationStatus(Boolean emailVerificationStatus) {
		this.emailVerificationStatus = emailVerificationStatus;
	}

	public static long getSerialversionuid() {
		return serialVersionUID;
	}

}

Adres:

package com.example.entity;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

import com.example.shared.dto.UserDto;

@Entity(name = "addresses")
public class AddressEntity implements Serializable {
	private static final long serialVersionUID = 4045874591122010207L;

	@Id
	@GeneratedValue
	private long id;

	@Column(length = 30, nullable = false)
	private String addressId;

	@Column(length = 15, nullable = false)
	private String city;

	@Column(length = 30, nullable = false)
	private String country;
	
	@Column(length = 30, nullable = false)
	private String streetName;
	
	@Column(length = 6 )
	private String postalcode;
	
	@Column(length = 30, nullable = false)
	private String type;
	
	@ManyToOne
	@JoinColumn(name="users_id")
	private UserEntity userDetails;

	public long getId() {
		return id;
	}

	public void setId(long id) {
		this.id = id;
	}

	public String getAddressId() {
		return addressId;
	}

	public void setAddressId(String addressId) {
		this.addressId = addressId;
	}

	public String getCity() {
		return city;
	}

	public void setCity(String city) {
		this.city = city;
	}

	public String getCountry() {
		return country;
	}

	public void setCountry(String country) {
		this.country = country;
	}

	public String getStreetName() {
		return streetName;
	}

	public void setStreetName(String streetName) {
		this.streetName = streetName;
	}

	public String getPostalcode() {
		return postalcode;
	}

	public void setPostalcode(String postalcode) {
		this.postalcode = postalcode;
	}

	public String getType() {
		return type;
	}

	public void setType(String type) {
		this.type = type;
	}

	public UserEntity getUserDetails() {
		return userDetails;
	}

	public void setUserDetails(UserEntity userDetails) {
		this.userDetails = userDetails;
	}

	public static long getSerialversionuid() {
		return serialVersionUID;
	}

	
	
	
	
	
}

Controller:

@GetMapping(path = "/{id}", produces = { MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_VALUE })
	public UserRest getUser(@PathVariable String id) {
		UserRest userRest = new UserRest();
		UserDto userDto = userService.getUserByUserId(id);
		BeanUtils.copyProperties(userDto, userRest);

		return userRest;
	}

Postman:

<UserRest>
    <userId>m0od418uzk30gegnxz2r0adbf5fuad</userId>
    <firstName>Adam7</firstName>
    <lastName>Kowalski7</lastName>
    <email>kuba@Nowako06</email>
    <addresses>
        <addresses>
            <id>49</id>
            <addressId>3zthhxdj68sfxbkwi0lsxw8we15ggx</addressId>
            <city>Warsawa</city>
            <country>Poland</country>
            <streetName>Wiejska</streetName>
            <postalcode>ABCCAB</postalcode>
            <type>billing</type>
            <userDetails>
                <id>48</id>
                <userId>m0od418uzk30gegnxz2r0adbf5fuad</userId>
                <firstName>Adam7</firstName>
                <lastName>Kowalski7</lastName>
                <email>kuba@Nowako06</email>
                <password>1237</password>
                <encryptedPassword>$2a$10$qcwtfxZCR/tiC.0vul/nDO56di/oCi1ev.XP2ZgNYC0/aFOIiUo0K</encryptedPassword>
                <emailVerificationToken/>
                <emailVerificationStatus>false</emailVerificationStatus>
                <addresses>
                    <addresses>
                        <id>49</id>
                        <addressId>3zthhxdj68sfxbkwi0lsxw8we15ggx</addressId>
                        <city>Warsawa</city>
                        <country>Poland</country>
                        <streetName>Wiejska</streetName>
                        <postalcode>ABCCAB</postalcode>
                        <type>billing</type>
                        <userDetails>
                            <id>48</id>
                            <userId>m0od418uzk30gegnxz2r0adbf5fuad</userId>
                            <firstName>Adam7</firstName>
                            <lastName>Kowalski7</lastName>
                            <email>kuba@Nowako06</email>
                            <password>1237</password>
                            <encryptedPassword>$2a$10$qcwtfxZCR/tiC.0vul/nDO56di/oCi1ev.XP2ZgNYC0/aFOIiUo0K</encryptedPassword>
                            <emailVerificationToken/>
                            <emailVerificationStatus>false</emailVerificationStatus>
                            <addresses>
                                <addresses>
                                    <id>49</id>
                                    <addressId>3zthhxdj68sfxbkwi0lsxw8we15ggx</addressId>

I tak w nieskończoność dodam że w tabeli User są tylko dwa rekordy. Może ktoś podpowie w czym może być problem. Z góry dzięki za każdą poradę.

1 odpowiedź

+1 głos
odpowiedź 1 października 2019 przez Aisekai Nałogowiec (42,190 p.)
Jsonowy parser nie jest wstanie sprawować do jsona obiektu ze względu na Cirrcular reference. User ma pole Adres, adres ma pole User. Musiałbyś to przerwać. Rozwiązanie albo DTO albo @JsonIgnoreProperty. Lepsze DTO.
komentarz 2 października 2019 przez JuniorPL Użytkownik (770 p.)

Dzięki za odpowiedź, udało mi się rozwiazać problem, wynikało to z problemu z przenchodzeniem między warstwami aplikacji, zastosowałem mapper i wszystko działa poprawnie.

@GetMapping(path = "/{id}", produces = { MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_VALUE })
	public UserRest getUser(@PathVariable String id)
	{
		UserRest userRest = new UserRest();
		UserDto userDto = userService.getUserByUserId(id);
		ModelMapper modelMapper = new ModelMapper();
		userRest = modelMapper.map(userDto,UserRest.class);		
	//	BeanUtils.copyProperties(userDto, userRest);

		return userRest;
	}

 

Podobne pytania

0 głosów
0 odpowiedzi 74 wizyt
pytanie zadane 28 października 2020 w PHP przez Ambroz Obywatel (1,840 p.)
0 głosów
1 odpowiedź 1,512 wizyt
pytanie zadane 29 lipca 2016 w SQL, bazy danych przez GaCeL Dyskutant (7,500 p.)
0 głosów
2 odpowiedzi 97 wizyt
pytanie zadane 22 września 2020 w PHP przez nowyklemens Początkujący (430 p.)

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...