简体   繁体   English

如何使用 Spring 引导从 POST 方法返回 object?

[英]How can I return an object from a POST method with Spring Boot?

I'm trying to create a communication between two services with Spring Boot, and I'm failing to return a custom object from a POST.我正在尝试使用 Spring Boot 在两个服务之间创建通信,但我无法从 POST 返回自定义 object。

I have tried something like我尝试过类似的东西

1st service:第一项服务:

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

2nd service:服务二:

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

The problem is I get an error message saying "cannot deserialize from Object value" for the Bid class, which makes me think the Auction is being sent but the Bid isn't sent back.问题是我收到一条错误消息,提示“无法从 Object 值反序列化”对于 Bid class,这让我认为正在发送拍卖,但没有发回 Bid。

I'm also not sure how the serialization happens for the auction, as I only put the "@RequestBody" and it started working.我也不确定拍卖的序列化是如何发生的,因为我只输入了“@RequestBody”,它就开始工作了。 The Auction class even has a Bid object inside, but that doesn't seem to be a problem.拍卖 class 甚至里面有一个出价 object,但这似乎不是问题。

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; }
}

The full stack trace is gigantic, but the part I think is relevant is this:完整的堆栈跟踪是巨大的,但我认为相关的部分是:

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"}"

Please try with adding @ResponseBody annotation to your Controller method bid .请尝试在您的 Controller 方法bid中添加@ResponseBody注释。 After doing this your HTTP response will have body with JSON representation of your object so it should be possible to serialize that back in your postForEntity.完成此操作后,您的 HTTP 响应将具有 JSON 表示的正文,表示您的 object,因此应该可以将其序列化回您的 postForEntity。

@PostMapping(value = "/bid")
@ResponseBody
public Bid bid(@RequestBody Auction auction){
    return new Bid();
}

For more information check below link:有关更多信息,请查看以下链接:

How does the Spring @ResponseBody annotation work? Spring @ResponseBody 注释如何工作?

When you transfer some stuff, make sure its serializable and also dont forget to add no arg constructor.当您传输一些东西时,请确保其可序列化并且不要忘记添加无 arg 构造函数。 This should work.这应该有效。

   class Bid implements Serializable {
    
    private URI host;

    public Bid();

    public URI getHost() {
        return host;
    }

    public void setHost(URI host) {
        this.host = host;
    }
}

I managed to make it work just by adding the default constructor to the Bid class, as discussed in the comments.正如评论中所讨论的,我设法通过将默认构造函数添加到 Bid class 来使其工作。

class Bid{
    private URI host;

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

    public URI getHost() { return host; }
}

当我有页面时,如何在 Spring 引导中进行测试<object>作为返回类型<div id="text_translate"><p>我正在尝试在我的服务 impl class 中测试我的保存方法。 它有 Page 作为返回类型。 测试成功,但我写错了,因为它在所有通常不应该的情况下都成功了请参阅下面的代码。</p><p> 服务 Class 实施</p><pre> @Service @Transactional public class CompanyServiceImpl implements CompanyService { private final CompanyRepository companyRepository; public CompanyServiceImpl(CompanyRepository companyRepository) { this.companyRepository = companyRepository; } @Override public Page&lt;Company&gt; findAll(Pageable pageable) { Page&lt;Company&gt; result = companyRepository.findAll(pageable); return result; } @Override public Page&lt;Company&gt; searchCompany(String companyName, Long companyGroupId, Pageable pageable) { Page&lt;Company&gt; result = companyRepository.findByParametersWeb(companyName,companyGroupId,pageable); return result; } @Override public Optional&lt;Company&gt; findById(Long id) { Optional&lt;Company&gt; entity = companyRepository.findById(id); return entity; } @Override public Company save(Company company) { Company entity = companyRepository.save(company); return entity; } @Override public void delete(Long id) { companyRepository.deleteById(id); } }</pre><p> 测试服务 class</p><pre> class CompanyServiceImplTest { @Mock private CompanyRepository companyRepository; private CompanyService companyService; private Company company; @BeforeEach void setUp() { MockitoAnnotations.initMocks(this); companyService = new CompanyServiceImpl(companyRepository); company = new Company(); company.setName("company"); company.setCompanyGroupId(1L); } @Test void searchCompany() { List&lt;Company&gt; companies = new ArrayList&lt;&gt;(); Pageable pageable= PageRequest.of(0,5); Page&lt;Company&gt; result = new PageImpl&lt;&gt;(companies,pageable,1); when(companyRepository.findByParametersWeb(anyString(),anyLong(),any(Pageable.class))).thenReturn(result); Page&lt;Company&gt; newResult = companyService.searchCompany("giorgos",1L,pageable); assertEquals(newResult.getTotalElements(),result.getTotalElements()); } }</pre><p> 最后是我的公司存储库</p><pre>@Repository public interface CompanyRepository extends JpaRepository&lt;Company, Long&gt; { @Query("SELECT a FROM Company a WHERE (:name is null or ((a.name LIKE:name AND LENGTH(:name) &gt; 0) OR ( a.name = '%')))") List&lt;Company&gt; findByCompanyName(@Param("name") String name); @Query("SELECT a FROM Company a WHERE (:name is null or (LENGTH(:name) &gt; 0 " + " AND ((:option = 'yes' AND a.name =:name) or (:option = 'start' AND a.name LIKE CONCAT(:name,'%')) " + " or (:option = 'end' AND a.name LIKE CONCAT('%',:name)) or (a.name LIKE CONCAT('%',:name,'%'))))) " + " AND (:companyGroupId is null or a.companyGroupId =:companyGroupId) ORDER BY a.name") Page&lt;Company&gt; findByParametersWeb(String name,Long companyGroupId, Pageable pageable); List&lt;Company&gt; findAllByNameOrderByName(); }</pre></div></object> - How can i make Testing in Spring boot when i have a Page<Object> as a return type

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何从 spring 引导中的端点同时返回 JSON object 和压缩文件夹 - How can i return a JSON object and a zipped folder simultaneously from on end point in spring boot 使用来自 POST 方法的 JDBCTemplate 存储对象数组 - Spring Boot - Storing object array with JDBCTemplate from POST method - Spring Boot 如何使用Spring Boot通过方法post在postman中发送2个不同的对象? - How to send 2 different object in postman by method post with Spring boot? 如何在Spring Boot Api post方法中接收自定义JSON对象 - How to receive customized JSON Object in Spring boot Api post Method 当我有页面时,如何在 Spring 引导中进行测试<object>作为返回类型<div id="text_translate"><p>我正在尝试在我的服务 impl class 中测试我的保存方法。 它有 Page 作为返回类型。 测试成功,但我写错了,因为它在所有通常不应该的情况下都成功了请参阅下面的代码。</p><p> 服务 Class 实施</p><pre> @Service @Transactional public class CompanyServiceImpl implements CompanyService { private final CompanyRepository companyRepository; public CompanyServiceImpl(CompanyRepository companyRepository) { this.companyRepository = companyRepository; } @Override public Page&lt;Company&gt; findAll(Pageable pageable) { Page&lt;Company&gt; result = companyRepository.findAll(pageable); return result; } @Override public Page&lt;Company&gt; searchCompany(String companyName, Long companyGroupId, Pageable pageable) { Page&lt;Company&gt; result = companyRepository.findByParametersWeb(companyName,companyGroupId,pageable); return result; } @Override public Optional&lt;Company&gt; findById(Long id) { Optional&lt;Company&gt; entity = companyRepository.findById(id); return entity; } @Override public Company save(Company company) { Company entity = companyRepository.save(company); return entity; } @Override public void delete(Long id) { companyRepository.deleteById(id); } }</pre><p> 测试服务 class</p><pre> class CompanyServiceImplTest { @Mock private CompanyRepository companyRepository; private CompanyService companyService; private Company company; @BeforeEach void setUp() { MockitoAnnotations.initMocks(this); companyService = new CompanyServiceImpl(companyRepository); company = new Company(); company.setName("company"); company.setCompanyGroupId(1L); } @Test void searchCompany() { List&lt;Company&gt; companies = new ArrayList&lt;&gt;(); Pageable pageable= PageRequest.of(0,5); Page&lt;Company&gt; result = new PageImpl&lt;&gt;(companies,pageable,1); when(companyRepository.findByParametersWeb(anyString(),anyLong(),any(Pageable.class))).thenReturn(result); Page&lt;Company&gt; newResult = companyService.searchCompany("giorgos",1L,pageable); assertEquals(newResult.getTotalElements(),result.getTotalElements()); } }</pre><p> 最后是我的公司存储库</p><pre>@Repository public interface CompanyRepository extends JpaRepository&lt;Company, Long&gt; { @Query("SELECT a FROM Company a WHERE (:name is null or ((a.name LIKE:name AND LENGTH(:name) &gt; 0) OR ( a.name = '%')))") List&lt;Company&gt; findByCompanyName(@Param("name") String name); @Query("SELECT a FROM Company a WHERE (:name is null or (LENGTH(:name) &gt; 0 " + " AND ((:option = 'yes' AND a.name =:name) or (:option = 'start' AND a.name LIKE CONCAT(:name,'%')) " + " or (:option = 'end' AND a.name LIKE CONCAT('%',:name)) or (a.name LIKE CONCAT('%',:name,'%'))))) " + " AND (:companyGroupId is null or a.companyGroupId =:companyGroupId) ORDER BY a.name") Page&lt;Company&gt; findByParametersWeb(String name,Long companyGroupId, Pageable pageable); List&lt;Company&gt; findAllByNameOrderByName(); }</pre></div></object> - How can i make Testing in Spring boot when i have a Page<Object> as a return type 如何使用 spring 引导从主页发送发布请求并操作它们? - How can i send post requests and manipulate them from the main page with spring boot? 如何在Spring Boot中通过检查嵌套对象来获取对象? - How can i get an object with checks on nested object in Spring boot? 如何使用 Spring Boot 返回成功消息? - How can I return a successful message using Spring Boot? 在 spring 引导中使用 post 方法时无法返回 html - Cannot return html when using post method in spring boot 我可以在春季使用afterThrowing()方法返回自定义类型的对象吗? - Can I return an Object of custom type using afterThrowing() method in spring?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM