当前位置: 首页 > 知识库问答 >
问题:

从其他实体检索ID时,Spring boot JPA反序列化问题

蒙峰
2023-03-14

我正在创建一个web程序,用spring boot、tomcat和JPA映射商店的占有率。我已经创建了成员模型/服务/控制器,当我尝试更新、创建、删除它或从中获取信息时,它工作正常。

然而,商店也没有被创建,当我用ownerId创建一个商店时,我会收到一条错误消息,说:

错误消息

[org.springframework.http.converter.httpMessageEndableException:JSON解析错误:无法构造com.project.so2.models.Member(尽管至少存在一个创建者):没有字符串参数构造函数/工厂方法从字符串值('1')反序列化; 嵌套的异常是com。fasterxml。杰克逊。数据绑定。exc.MismatchedInputException:无法构造com的实例。项目二氧化硫。模型。成员(尽管至少存在一个创建者):在[Source:(PushbackInputStream);第4行,第18列](通过引用链:com.project.so2.models.Store[“owner_id”])没有字符串参数构造函数/工厂方法从字符串值('1')反序列化

我曾试图查找类似的问题,但没有找到任何适用的解决方案。

模型

商店

@Entity(name = "Store")
@Table(name = "store")
@SequenceGenerator(name = "store_id")
public class Store {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "store_id")
    @Column(name = "id")
    private long id;

    //many stores to one owner
    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @OnDelete(action = OnDeleteAction.CASCADE)
    @JoinColumn(name = "owner_id", referencedColumnName = "id")
    private Member owner_id;
    
    //one store to many occupation level
    @OneToMany(mappedBy = "store")
    private List<Occupation> store_occupation;
    
    @OneToOne(mappedBy = "store")
    private Location location;

    @Column(name = "name")
    private String name;

    @Column(name = "square_footage")
    private String square_footage;

    public Store() {
    }

成员

@Entity(name = "Member")
@Table(name = "member")
@SequenceGenerator(name = "member_id")
public class Member {
    
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "member_id")
    @Column(name = "id")
    private long id;
    
    @Enumerated(EnumType.STRING)
    @Column(name = "role")    
    private Role role;//customer|admin|store_owner
    
    @Column(name = "mail", unique = true)
    private String mail;
    
    @Column(name = "name")
    private String name;

    @OneToMany(mappedBy = "owner_id")
    private List<Store> stores;
    
    
    
    /**
     * REALM to store passwords
     */
    
    @CreationTimestamp
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date createdAt;
    
    @UpdateTimestamp
    private Date updateAt;

商店管理员

@RestController
@RequestMapping("/store")
@ControllerAdvice()
@CrossOrigin
public class StoreController {
    @Autowired
    private StoreService storeservice;

    @PostMapping("/create")
    public ResponseEntity<HttpStatus> createStore(@RequestBody Store store) {
        try {
            this.storeservice.saveStore(store);
            return new ResponseEntity<>(HttpStatus.CREATED);
        } catch (Exception e) {
            return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }

商店服务

@Service
public class StoreService {
    
    @Autowired
    private StoreRepository storeRepository;//

    public void saveStore(Store store) {
        this.storeRepository.save(store); 
    }

请求有效载荷:

{
    "name": "Pingo Azedo",
    "square_footage": "25m^2",
    "owner_id":{
        "member_id": "1"
    }
}

老实说,我不明白这个问题,也不知道如何解决它。如果有人能帮忙,我们将不胜感激!

共有2个答案

钱宇
2023-03-14

您需要在负载中使用属性名,而不是列名。更改您的请求负载,如下所示,

{
  "name": "Pingo Azedo",
  "square_footage": "25m^2",
  "owner_id":{
       "id" : 1
    }
}
白灿
2023-03-14

您正在尝试从json反序列化成员,但jackson不知道如何仅用“member_id”填充此成员,错误显然是这样说的“找不到带字符串的构造函数”。因此,为了获得成员id,需要添加新的类请求dto,比如:

String name;
String footage;
Long owner_id;

控制器中使用新类,现在使用owner_id,使用repository在数据库中查找它,然后将其设置为存储。

 类似资料:
  • 问题内容: log4j网络适配器将事件作为序列化的Java对象发送。我希望能够捕获此对象并以另一种语言(python)将其反序列化。这可能吗? 注意 网络捕获很容易;它只是一个TCP套接字并在流中读取。困难是反序列化部分 问题答案: 通常,不会。 本文档中定义了Java序列化的流格式,但是您需要访问原始类定义(以及将它们加载到Java运行时中)以将流数据转换回接近原始对象的内容。例如,类可以定义w

  • 问题内容: 我将一个序列化为一个文件,并将该文件传输到另一台计算机上的另一个系统。 而且由于接收文件的系统是不同的,所以我没有相同的类,而是具有完全相同的结构但使用不同的包的类。 当我使用 从文件中读出我有一个。 如何避免这种异常?是否仅在接收列表时需要在其他系统中创建相同的包结构? 问题答案: 是的,您可以做三件事之一。 用相同的包名称创建相同的类 创建一个接口(当然,在两台计算机上都使用相同的

  • 为了确保在我的RESTful web服务中来回发送的数据不冗余,每个嵌套对象都只序列化了它的ID(消息的用户只序列化了用户ID,因为客户端和服务器都已经知道用户的所有详细信息)。 序列化工作正常,产生以下效果: 问题:反序列化不会生成仅具有其ID的嵌套对象。生成的反序列化嵌套对象为空。 以下是前面提到的消息和用户对象。序列化“策略”是从此处指定的第三个选项中使用的:如何仅序列化Jackson的子级

  • 有一个奇怪的问题,想不出该怎么处理。有简单的POJO: UPD有双向Hibernate映射,也许它与问题有关。

  • 好的,我做了更改,下面是我得到的JSON响应 它现在导致一个嵌套异常是java.lang.IllegalArgumentException:参数类型不匹配 NestedServletException:请求处理失败;嵌套异常是java.lang.IllegalArgumentException:参数类型不匹配org.springframework.web.servlet.framework.ser

  • 问题内容: 像其他几个人一样,我在序列化Entity Framework对象时遇到问题,因此我可以通过JSON格式的AJAX发送数据。 我有以下服务器端方法,我正在尝试通过jQuery使用AJAX进行调用 通过AJAX调用会导致此错误: 这是因为实体框架创建循环引用以保持所有对象相关并且可访问服务器端的方式。 我从(http://hellowebapps.com/2010-09-26/produc