• 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

Cloud VPS
0 głosów
271 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 96 wizyt
pytanie zadane 28 października 2020 w PHP przez Ambroz Obywatel (1,840 p.)
0 głosów
1 odpowiedź 1,776 wizyt
pytanie zadane 29 lipca 2016 w SQL, bazy danych przez GaCeL Dyskutant (7,500 p.)
0 głosów
2 odpowiedzi 172 wizyt
pytanie zadane 22 września 2020 w PHP przez nowyklemens Początkujący (430 p.)

93,457 zapytań

142,452 odpowiedzi

322,722 komentarzy

62,837 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

Kursy INF.02 i INF.03
...