簡體   English   中英

如何使用 Spring 引導從 POST 方法返回 object?

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

我正在嘗試使用 Spring Boot 在兩個服務之間創建通信,但我無法從 POST 返回自定義 object。

我嘗試過類似的東西

第一項服務:

@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();

問題是我收到一條錯誤消息,提示“無法從 Object 值反序列化”對於 Bid class,這讓我認為正在發送拍賣,但沒有發回 Bid。

我也不確定拍賣的序列化是如何發生的,因為我只輸入了“@RequestBody”,它就開始工作了。 拍賣 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; }
}

完整的堆棧跟蹤是巨大的,但我認為相關的部分是:

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

請嘗試在您的 Controller 方法bid中添加@ResponseBody注釋。 完成此操作后,您的 HTTP 響應將具有 JSON 表示的正文,表示您的 object,因此應該可以將其序列化回您的 postForEntity。

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

有關更多信息,請查看以下鏈接:

Spring @ResponseBody 注釋如何工作?

當您傳輸一些東西時,請確保其可序列化並且不要忘記添加無 arg 構造函數。 這應該有效。

   class Bid implements Serializable {
    
    private URI host;

    public Bid();

    public URI getHost() {
        return host;
    }

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

正如評論中所討論的,我設法通過將默認構造函數添加到 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 和壓縮文件夾 使用來自 POST 方法的 JDBCTemplate 存儲對象數組 - Spring Boot 如何使用Spring Boot通過方法post在postman中發送2個不同的對象? 如何在Spring Boot Api post方法中接收自定義JSON對象 當我有頁面時,如何在 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> 如何使用 spring 引導從主頁發送發布請求並操作它們? 如何在Spring Boot中通過檢查嵌套對象來獲取對象? 如何使用 Spring Boot 返回成功消息? 在 spring 引導中使用 post 方法時無法返回 html 我可以在春季使用afterThrowing()方法返回自定義類型的對象嗎?
 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM