2016-02-27 99 views
0

我對前端開發非常陌生。我有一個簡單的web應用程序,您可以在其中提交表單,並且我希望能夠在REST端點中獲取表單數據。我正在使用包含Spring MVC的Spring引導。使用Spring獲取表單數據時遇到困難

的HTML:

<div class="modal-header modal-header-info"> 
    <button type="button" class="close" data-dismiss="modal" 
     aria-hidden="true">&times;</button> 
    <h4 class="modal-title">Add Entity</h4> 
</div> 
<div class="modal-body"> 
    <form role="form" method="post" action="/createEntity"> 
     <div class="form-group"> 
      <label for="name">Name:</label> <input type="text" 
       class="form-control" id="name"> 
     </div> 
     <button type="submit" class="btn btn-info">Submit</button> 
    </form> 
</div> 

Java的:

@RequestMapping(value = "/createEntity", method = RequestMethod.POST) 
public void createEntity(@RequestBody String payload) { 
    System.out.println("Hello world!"); 
    System.out.println(payload); 
} 

我得到這個錯誤回:

Failed to read HTTP message: 
      org.springframework.http.converter.HttpMessageNotReadableException: 
      Required request body is missing: public void main.java.info.spring.data.neo4j.controllers.CreateEntityController.createEntity(java.lang.String) 

我如何從表單中的 「名」 的價值?如果我取出@RequestBody部分,則會打印出「hello world」屬性。

編輯:每個請求我的配置:

@EnableTransactionManagement 
@Import(RepositoryRestMvcConfiguration.class) 
@EnableScheduling 
@EnableAutoConfiguration 
@ComponentScan(basePackages = { "main.java.info.spring.data.neo4j.services", 
     "main.java.info.spring.data.neo4j.controllers" }) 
@Configuration 
@EnableNeo4jRepositories(basePackages = "main.java.info.spring.data.neo4j.repositories") 
public class MyNeo4jConfiguration extends Neo4jConfiguration { 

    public static final String URL = System.getenv("NEO4J_URL") != null ? System.getenv("NEO4J_URL") 
      : "http://localhost:7474"; 

    @Override 
    public Neo4jServer neo4jServer() { 
     return new RemoteServer(URL, "neo4j", "LOL my pass"); 

    } 

    @Override 
    public SessionFactory getSessionFactory() { 
     return new SessionFactory("main.java.info.spring.data.neo4j.domain"); 
    } 
} 
+0

你能展示你的配置嗎? –

+0

在@ manish的回答中查看**問題1 **。這真的可能是這個問題,因爲沒有名字的輸入可以被認爲是不正確的語法。 –

回答

1

問題1:HTML表單控件缺少name屬性

<input type="text" class="form-control" id="name"> 

缺少name屬性。它應該是:

<input type="text" class="form-control" id="name" name="name"/> 

這將提交控制作爲HTTP請求主體中的形式參數,像:

name: [the value you specify for the control] 

問題2@RequestBody作爲控制器方法參數將給你整個HTTP請求體

public void createEntity(@RequestBody String payload) 

表示您希望將整個HTTP請求正文作爲String傳遞給控制器​​方法createEntity。如果你的HTML表單確實是你已經發布的東西,你會得到以下值​​(你已經解決了之後的問題1):

name: [the value you specify for the control] 

如果這是你想要的東西,保持@RequestBody註釋,但我懷疑您只對name請求參數的值感興趣。如果是這樣的話,您需要在方法聲明中改變(你已經解決了問題1後):

public void createEntity(@RequestParam String name) 

這將HTTP請求參數name映射到控制器方法參數name

問題3:有void返回類型的控制器的方法將迫使Spring MVC中尋找具有相同的名稱作爲方法名

視圖既然你的控制器方法聲明:

public void createEntity(@RequestBody String payload) 

Spring MVC的會尋找一個名爲此方法退出後createEntity視圖。如果你有這個名字的觀點,那就很好。否則,一旦你解決了問題1和2,你將得到404 - Resource not found錯誤。

+0

**問題2 **:在這種情況下'StringHttpMessageConverter'將被使用。而且這個轉換器不需要名稱約定,因爲它返回請求主體的所有文本。 –

+0

**問題3 **:對於REST Controller的方法,'void'返回類型是OK的。 –

+0

這工作,謝謝你禮貌地回答這個問題。 –

相關問題