状态 400 和反序列化对象列表时出错。未找到默认构造函数

Posted

技术标签:

【中文标题】状态 400 和反序列化对象列表时出错。未找到默认构造函数【英文标题】:Status 400 and Error deserializing List of Objects. No default constructor found 【发布时间】:2019-05-08 14:39:54 【问题描述】:

我有这个 Spring 存储库:

public interface MessageRepository extends CrudRepository<MessageObject, String>

public List<MessageObject> findByEmisorOrDestinatario(String emisor, String destinatario);

我的 DAO 是:

@Entity
@Table(name = "messages")
public class MessageObject implements Serializable

private static final long serialVersionUID = 1L;
@Id
private String id;
private String emisor;
private String destinatario;
private String mensaje;
private String tipo;
@JsonFormat(pattern="yyyy-MM-dd")
private LocalDate fecha;
private String id_housing;

public MessageObject() 

  

现在在我的控制器中,我想接收 Get 请求并在我的数据库中搜索:

@RestController
public class Controller 

@Autowired
private MessageRepository daoMsg;

@RequestMapping(value = "/Mensajes", method = RequestMethod.GET, produces=MediaType.APPLICATION_JSON_VALUE)
public List<MessageObject> enviados (@RequestParam("mail") String mail) 
    return daoMsg.findByEmisorOrDestinatario(mail, mail);   

   

现在我可以从我的客户端调用服务了,所以:

ClientConfig config = new ClientConfig();
    Client client = ClientBuilder.newClient();

    WebTarget webResource = client.target("http://localhost:8082").path("/Mensajes").queryParam(mail);
    Invocation.Builder invocationBuilder = webResource.request(MediaType.APPLICATION_JSON);
    Response respuesta = invocationBuilder.get();
    int status = respuesta.getStatus();
    System.out.println(status);
    MessageObject[] listMessages = respuesta.readEntity(MessageObject[].class);

问题:我收到 400 状态代码。反序列化 entityRead 也是一个错误。使用 Postman 执行请求不会返回错误并返回 JSON 格式的对象列表。

堆栈跟踪:

javax.ws.rs.ProcessingException: Error deserializing object from entity 
stream. Caused by: javax.json.bind.JsonbException: Can't create instance of 
a class: class [LMessages.MessageObject; 
No default constructor found. Caused by: java.lang.NoSuchMethodException: 
[LMessages.MessageObject;.<init>()

问题:我怎么知道我的代码哪里出错了?我是否很好地使用了服务调用?

我尝试过的事情:将 Mediatype 更改为 GenericType

编辑我尝试从路径中删除/,仍然获得状态400

【问题讨论】:

/Mensajes删除/ @Spara 已删除但仍然出现相同的错误。 【参考方案1】:

尝试用这个来测试:

   @RestController
    public class Controller 

    @Autowired
    private MessageRepository daoMsg;

    @RequestMapping(value = "/Mensajes", method = RequestMethod.GET, produces=MediaType.APPLICATION_JSON_VALUE)
    @ReponseBody
    public ResponseEntity<List<MessageObject>> enviados (@RequestParam("mail") String mail) 
        return new ResponseEntity<>(daoMsg.findByEmisorOrDestinatario(mail, mail), HttpStatus.OK);  

     

【讨论】:

经过测试,但出现同样的错误。 Caused by: javax.json.bind.JsonbException: Can't create instance of a class: class [LMessages.MessageObject;, No default constructor found. 有趣的是,我没有一个名为 LMessages 的包,而是 Messages。【参考方案2】:

解决了。问题是我使用没有键值结构的.queryparam。所以将.queryparam(mail) 更改为.queryparam("mail", mail) 解决了它。

【讨论】:

以上是关于状态 400 和反序列化对象列表时出错。未找到默认构造函数的主要内容,如果未能解决你的问题,请参考以下文章

python 序列化和反序列化

Python 对象的序列和反序列化

序列化和反序列化

序列化和反序列化

java反序列化引起的内存溢出怎么解决

Dubbo中Map类型默认的序列化和反序列化