2017-03-05 4 views
1

Ich habe mit dem Problem konfrontiert, dass Konverter JSON-Objekt nicht behandeln kann.Jackson fehlgeschlagen bei der Deserialisierung OneToMany Objekte

Ich habe zwei Objekte in der Datenbank. Beziehung OneToMany.

Ich habe einen AutoService mit vielen Diensten.

Und wnen Ich versuche, JSON-Objekt Postbote auf meinen Server zu senden - ich eine Störung erhalte:

WARN org.springframework.http.converter.json.MappingJackson2HttpMessageConverter - Failed to evaluate Jackson deserialization for type [[simple type, class com.webserverconfig.user.entity.AutoService]]: java.lang.IllegalArgumentException: Can not handle managed/back reference 'defaultReference': no back reference property found from type [collection type; class java.util.List, contains [simple type, class com.webserverconfig.user.entity.Service]] 

Next zwei Klassen repräsentiert mein Modell:

Klasse Autoservice:

@Entity 
@Table(name = "AutoRate") 
public class AutoService { 

    public AutoService() { 
    } 

    @Id 
    @GeneratedValue(generator = "increment") 
    @GenericGenerator(name = "increment", strategy = "increment") 
    private long id; 

    @Column(name = "serviceName", nullable = false) 
    private String serviceName; 

    @Column(name = "imageURL", nullable = false) 
    private String imageURL; 

    @Column(name = "mapCoordinate", nullable = false) 
    private String mapCoordinate; 

    @Column(name = "websiteURL", nullable = false) 
    private String websiteURL; 

    @Column(name = "phoneNumber", nullable = false) 
    private String phoneNumber; 

    @JsonManagedReference 
    @OneToMany(fetch = FetchType.EAGER) 
    @JoinColumn(name = "autoServiceId") 
    private List<Service> services; 

    public long getId() { 
     return id; 
    } 

    public String getServiceName() { 
     return serviceName; 
    } 

    public String getImageURL() { 
     return imageURL; 
    } 

    public String getMapCoordinate() { 
     return mapCoordinate; 
    } 

    public String getWebsiteURL() { 
     return websiteURL; 
    } 

    public String getPhoneNumber() { 
     return phoneNumber; 
    } 

    public List<Service> getServices() { 
     return services; 
    } 
} 

Class Service:

@Entity 
@Table(name = "Service") 
public class Service { 

    public Service() { 
    } 

    @Id 
    @GeneratedValue(generator = "increment") 
    @GenericGenerator(name = "increment", strategy = "increment") 
    @Column(name = "serviceId", unique = true, nullable = false) 
    private long serviceId; 

    @Column(name = "serviceName", nullable = false) 
    private String serviceName; 

    @Column(name = "category", nullable = false) 
    private String category; 

    @Column(name = "price", nullable = false) 
    private int price; 

    @Column(name = "autoServiceId", nullable = false) 
    private long autoServiceId; 

    public long getId() { 
     return serviceId; 
    } 

    public String getCategory() { 
     return category; 
    } 


    public int getPrice() { 
     return price; 
    } 

    public String getServiceName() { 
     return serviceName; 
    } 

    public long getAutoServiceId() { 
     return autoServiceId; 
    } 
} 

Um Hilfe bitten. Fehle ich eine Anmerkung?

auch Klasse Controller:

@RestController 
@RequestMapping("/directory") 
public class ServiceController { 

    @Autowired 
    private AutoRateService dataBaseService; 

    @RequestMapping(value = "/get", method = RequestMethod.GET) 
    @ResponseBody 
    public AutoService getData(){ 
     AutoService dataList = dataBaseService.getById(1); 
     return dataList; 
    } 

    @RequestMapping(value = "/saveService", method = RequestMethod.POST) 
    @ResponseBody public AutoService saveAutoService(@RequestBody AutoService autoService){ 
     return dataBaseService.save(autoService); 
    } 
} 

Antwort

1

Sie @JsonBackReference auf der anderen Seite der Beziehung hinzufügen könnte. Was übrigens fehlt oder nicht korrekt umgesetzt wird. Hinzufügen:

@JsonBackReference 
@ManyToOne 
@JoinColumn(name = "autoServiceId", nullable = false) 
private AutoService autoService; 

anstelle von private long autoServiceId;.

Auch muss der Autoservice mit angepasst werden:

@JsonManagedReference 
@OneToMany(mappedBy = "autoService", fetch=FetchType.EAGER) 
private List<Service> services = new ArrayList<>(); 
Verwandte Themen