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

如何使用Spring Boot从POST方法返回对象?

沈鸿光
2023-03-14

我试图使用Spring Boot在两个服务之间创建通信,但我无法从POST返回自定义对象。

我已经尝试过类似

第一次保养:

@RestController
@RequestMapping("/broker")
class HostController{
    @PostMapping(value = "/bid")
    public Bid bid(@RequestBody Auction auction){
        return new Bid(new URI("http://url:8080"));
    }
}

第二服务:

ResponseEntity<Bid> response = rest.postForEntity(hostURL + "/bid", auction, Bid.class);
response.getBody();

问题是,我收到一条错误消息,说Bid类“无法从对象值反序列化”,这使我认为拍卖正在发送,但出价没有返回。

我也不确定拍卖的序列化是如何进行的,因为我只放了“@RequestBody”,它就开始工作了。拍卖类内部甚至有一个出价对象,但这似乎不是问题。

class Bid{
    private URI host;
    
    public Bid(URI host){ this.host = host; }

    public URI getHost() { return host; }
}

class Auction{
    URI host;

    private Bid winner; //Not defined when the problem happens

    public Auction(URI host){ this.host = host; }
    
    public URI getHost(){ return host; }
}

完整的堆栈跟踪是巨大的,但我认为相关的部分是:

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.gustavovbs.microservicesoffloading.Bid` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)\n at [Source: (PushbackInputStream); line: 1, column: 2]\n\tat
 
com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:67)\n\tat
 com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1764)\n\tat
 com.fasterxml.jackson.databind.DatabindContext.reportBadDefinition(DatabindContext.java:400)\n\tat

com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1209)\n\tat
 com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1415)\n\tat
 com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:362)\n\tat
 com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:195)\n\tat
 com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:322)\n\tat
 com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4593)\n\tat
 com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3601)\n\tat
 org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:378)\n\t... 63 more\n","message":"Type definition error: [simple type, class com.gustavovbs.microservicesoffloading.Bid]; 

nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.gustavovbs.microservicesoffloading.Bid` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)\n at [Source: (PushbackInputStream); line: 1, column: 2]","path":"/broker/broadcast"}"

共有2个答案

子车青青
2023-03-14

正如评论中所讨论的,我只需将默认构造函数添加到Bid类中,就可以使其正常工作。

class Bid{
    private URI host;

    public Bid(){}
    
    public Bid(URI host){ this.host = host; }

    public URI getHost() { return host; }
}
王俊楚
2023-03-14

当你传输一些东西时,确保它是可序列化的,并且不要忘记添加arg构造函数。这应该可以工作。

   class Bid implements Serializable {
    
    private URI host;

    public Bid();

    public URI getHost() {
        return host;
    }

    public void setHost(URI host) {
        this.host = host;
    }
}
 类似资料:
  • 问题内容: 我想从Java方法返回两个对象,并且想知道这样做的好方法是什么? 我能想到的可能的方法是:回报HashMap(因为这两个对象是相关的),或者返回的对象。 更准确地说,我要返回的两个对象是(a)对象和(b)相同名称的逗号分隔。 我想从一个方法返回这两个对象,因为我不想遍历对象列表以获得逗号分隔的名称(我可以在此方法的同一循环中执行此操作)。 不知何故,返回a 看起来不是很优雅的方式。 问

  • 问题内容: 我试图通过以下方式获取JSON对象: 以下是处理所有HTTP请求的一般方法 处理JSON结果的方法如下: 我想问一下如何以异步方式取回JSONObject(第一个代码段)。 所有请求均使用Volley库处理。 非常感谢您的任何建议。 问题答案: 供您评论 我认为异步是由Volley自动提供的。所以我需要知道如何将JSON数据放入第一个片段中 IMO,而不是您的第一个片段,您可以尝试以下

  • 问题内容: 我正在尝试从call()返回2D数组,但遇到了一些问题。到目前为止,我的代码是: 这段代码会编译,这不会返回我的数组。我确定我可能使用了错误的语法,但是找不到任何好的示例。 编辑:改变了一点 问题答案: 添加到Joseph Ottinger的答案中,要传递要在Callable的call()方法中使用的值,可以使用闭包:

  • 我正在研究一种随机数方法,从数组中选取一个随机元素。但是,我不知道如何打印方法的返回值。这是密码。

  • 我开始进入WP开发,我有问题与ACF后对象返回空,我不知道为什么。我创建了一个ACF,分类法的位置等于类别然后字段设置为... 字段名称:推荐的\u资源 然后在岗位上 我得到了无效的任何帮助或指向正确的方向都是非常感谢的。

  • 问题内容: 我在Moxy上使用Jersey 2.17,并且具有以下功能: User.preferences是一个。 除了将a 转换为: “ preferences”:{“ entry”:[{“ key”:{“ type”:“ string”,“ value”:“ language”},“ value”:{“ type”:“ string”,“ value”: “ en”}},{“ key”:{“