2016-10-25 5 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/" 
} 

事前にありがとうございます!

EDIT 2:

私はちょうど同じコントローラを使用して新しいプロジェクトを作成し、すべてがうまく動作します。問題が春のセキュリティであることが判明したので、何らかの理由ですべてのリクエストを許可しても、PostメソッドとPutメソッドは機能しません。それが私の問題でした。

+0

404クライアントエラーです。リクエストを投稿する必要があります – Jaiwo99

+0

投稿メッセージをカールで共有できますか? –

+0

/rest/temperatureまたは/ rest/temperature /に投稿していますか? 最後に「/」があることに注意してください。 –

答えて

0

@RestControllerを使用する場合は、あなたが方法で@ResponseBodyは必要ありません。この方法は、どのような種類の本文の内容を受け入れることができないので。この方法が唯一のHTTP要求からコンテンツを受信すると、あなたは404を取得し、あなたの体の内容を戻しません、あなたはconsumesが必要です。 ResponseEntity<xxx>は、HttpStatusに加えてメソッドが返すボディコンテンツを定義します。本体の内容がなく、HttpStatusだけが返された場合は、ResponseEntity<Void>を使用する必要があります。今、あなたは、クライアント側ではhttpStatus 201 Createdを取得する必要があり、次の

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

を試してみてください。

0

アプリケーション/ JSON "=消費" を追加してください」このようなあなたの@RequestMapping内を:

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

+0

すでにこれを試してみましたが、残念ながらそれは助けになりません。私は同じアプリケーションでspring mvcコントローラとthymeleafを使用するので、いくつかの問題がありますか? –

0

追加してみてください "このようなあなたのRequestMappingに" ヘッダは= "同意=アプリケーション/ JSONを":

@RequestMapping(value = "/temperature", method = RequestMethod.POST, headers = "Accept=application/json") 
関連する問題