2016-10-25 13 views
1

我遇到了Spring REST Web服務的問題。當我嘗試發佈JSON時,我總是得到404錯誤。獲取請求可以正常工作,但不會發布。搜索整個互聯網,但無法找到類似的問題。也許你們可以幫助我。這裏是我的代碼:Java Spring REST獲取工作就好了,但發佈json時,我得到404錯誤

控制器:

package com.java.rest; 
import com.java.dto.IncomingTemperature; 
import com.java.dto.SensorsTemperature; 
import com.java.service.GetSensorsTemperature; 
import com.java.service.TemperatureService; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.http.HttpStatus; 
import org.springframework.http.ResponseEntity; 
import org.springframework.web.bind.annotation.*; 


@RestController 
@RequestMapping("/rest") 
public class TemperatureRestController { 

final static Logger logger = LoggerFactory.getLogger(TemperatureRestController.class); 

@Autowired 
TemperatureService temperatureService; 
@Autowired 
GetSensorsTemperature sensorService; 

@RequestMapping(value = "/temperature", method = RequestMethod.POST, produces = "application/json") 
@ResponseBody 
public ResponseEntity<?> addTemperature(@RequestBody IncomingTemperature temperature){ 
    logger.info("Temperature: {} recieved", temperature); 
    temperatureService.addTemperature(temperature); 
    return new ResponseEntity<HttpStatus>(HttpStatus.CREATED); 
} 

@RequestMapping(value = "/temperature/{sensorId}", method = RequestMethod.GET, produces = "application/json") 
public SensorsTemperature getTemperature(@PathVariable("sensorId") Long sensorId){ 
    logger.info("Getting temperatures for sensor{}", sensorId); 
    return sensorService.getSensorsTemperature(sensorId); 
} 

}

型號:

package com.java.dto; 


import com.fasterxml.jackson.annotation.JsonFormat; 

import java.io.Serializable; 
import java.util.Date; 

public class IncomingTemperature implements Serializable{ 

    private long sensorId; 

    private double temperature; 

    @JsonFormat(shape= JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss") 
    private Date date; 

    public long getSensorId() { 
     return sensorId; 
    } 

    public void setSensorId(long sensorId) { 
     this.sensorId = sensorId; 
    } 

    public double getTemperature() { 
     return temperature; 
    } 

    public void setTemperature(double temperature) { 
     this.temperature = temperature; 
    } 

    public Date getDate() { 
     return date; 
    } 

    public void setDate(Date date) { 
     this.date = date; 
    } 

的pom.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.java</groupId> 
    <artifactId>knowyourheat</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>jar</packaging> 

    <name>KnowYourHeat</name> 
    <description>Application for temperature monitoring</description> 

    <parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.4.0.RELEASE</version> 
     <relativePath/> <!-- lookup parent from repository --> 
    </parent> 

    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 
     <java.version>1.8</java.version> 
    </properties> 

    <dependencies> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-data-jpa</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-security</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-thymeleaf</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-web</artifactId> 
     </dependency> 

     <dependency> 
      <groupId>mysql</groupId> 
      <artifactId>mysql-connector-java</artifactId> 
      <scope>runtime</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-mail</artifactId> 
     </dependency> 

     <dependency> 
      <groupId>javax.mail</groupId> 
      <artifactId>mail</artifactId> 
      <version>1.4.3</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-test</artifactId> 
      <scope>test</scope> 
     </dependency> 
    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
      </plugin> 
     </plugins> 
    </build> 


</project> 

的JSON我發帖:

{ 
"sensorId" : 1, 
"temperture" : 20, 
"date" : "2016-10-20 22:10:10" 
} 

編輯:

錯誤,我得到:

{ 
    "timestamp": 1477601444227, 
    "status": 404, 
    "error": "Not Found", 
    "message": "No message available", 
    "path": "/rest/temperature/" 
} 

預先感謝您!

編輯2:

我剛剛創建新的項目使用相同的控制器,一切工作得很好。由於我發現問題出在春季安全問題上,出於某種原因,即使我允許所有請求,Post和Put方法也不起作用。所以那是我的問題。

+0

404是客戶端錯誤,您需要發佈您的請求 – Jaiwo99

+0

你能分享你的郵件curl嗎? –

+0

您正在發佈/休息/溫度或/休息/溫度/? 注意最後的「/」。 –

回答

0

使用@RestController,你並不需要在方法@ResponseBody。你得到404因爲該方法不能接受任何形式的主體內容。當方法只從HTTP請求接收內容,但不發回正文內容,您只需要consumes。除了HttpStatus,ResponseEntity<xxx>定義了方法返回的主體內容。如果它沒有返回正文內容並且只有HttpStatus,則必須使用ResponseEntity<Void>。請嘗試以下

@RequestMapping(value = "/temperature", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE) 
public ResponseEntity<Void> addTemperature(@RequestBody IncomingTemperature temperature){ 
    logger.info("Temperature: {} recieved", temperature); 
    temperatureService.addTemperature(temperature); 
    return new ResponseEntity<Void>(HttpStatus.CREATED); 
} 

現在你應該得到的HTTPStatus 201 Created上的客戶端。

0

嘗試添加 「消耗=」 應用/ JSON的」在你的@RequestMapping這樣的:

@RequestMapping(value = "/temperature", method = RequestMethod.POST, produces = "application/json", consumes="application/json")

+0

已經嘗試過,但可惜它不會幫助。可能有一些問題,因爲我在同一個應用程序中使用spring mvc控制器和thymeleaf? –

0

嘗試增加 「標題= 」接受=應用/ JSON的「 在你的RequestMapping」 是這樣的:

@RequestMapping(value = "/temperature", method = RequestMethod.POST, headers = "Accept=application/json") 
相關問題