状态 400 和反序列化对象列表时出错。找不到默认构造函数
Status 400 and Error deserializing List of Objects. No default constructor found
我有这个 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 return 执行请求没有错误,并且 return 对象列表采用 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
EDIT 我尝试从路径中删除 /
,仍然得到状态 400
尝试用这个测试:
@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);
}
已解决。问题是我使用的 .queryparam
没有键值结构。所以将 .queryparam(mail)
更改为 .queryparam("mail", mail)
解决了它。
我有这个 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 return 执行请求没有错误,并且 return 对象列表采用 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
EDIT 我尝试从路径中删除 /
,仍然得到状态 400
尝试用这个测试:
@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);
}
已解决。问题是我使用的 .queryparam
没有键值结构。所以将 .queryparam(mail)
更改为 .queryparam("mail", mail)
解决了它。