Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 27 additions & 4 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<modelVersion>4.0.0</modelVersion>

<groupId>org.springframework</groupId>
<artifactId>gs-rest-service</artifactId>
<artifactId>springboot-protobuf</artifactId>
<version>0.1.0</version>

<parent>
Expand All @@ -18,7 +18,11 @@
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

<protobuf.version>3.2.0</protobuf.version>
<!--<protobuf.version>3.2.0</protobuf.version>-->
<!--grpc版本号-->
<!--<grpc.version>1.7.0</grpc.version>-->
<!--protobuf 版本号-->
<protobuf.version>3.4.0</protobuf.version>
<protobuf-java-format.version>1.4</protobuf-java-format.version>
<java.version>1.8</java.version>
</properties>
Expand Down Expand Up @@ -65,14 +69,33 @@
<scope>test</scope>
</dependency>

<!--<dependency>-->
<!--<groupId>io.grpc</groupId>-->
<!--<artifactId>grpc-netty</artifactId>-->
<!--<version>${grpc.version}</version>-->
<!--<scope>provided</scope>-->
<!--</dependency>-->
<!--<dependency>-->
<!--<groupId>io.grpc</groupId>-->
<!--<artifactId>grpc-protobuf</artifactId>-->
<!--<version>${grpc.version}</version>-->
<!--<scope>provided</scope>-->
<!--</dependency>-->
<!--<dependency>-->
<!--<groupId>io.grpc</groupId>-->
<!--<artifactId>grpc-stub</artifactId>-->
<!--<version>${grpc.version}</version>-->
<!--<scope>provided</scope>-->
<!--</dependency>-->

</dependencies>

<build>
<extensions>
<extension>
<groupId>kr.motd.maven</groupId>
<artifactId>os-maven-plugin</artifactId>
<version>1.3.0.Final</version>
<version>1.5.0.Final</version>
</extension>
</extensions>

Expand All @@ -96,7 +119,7 @@
</execution>
</executions>
<configuration>
<protocArtifact>com.google.protobuf:protoc:3.0.0:exe:${os.detected.classifier}</protocArtifact>
<protocArtifact>com.google.protobuf:protoc:${protobuf.version}:exe:${os.detected.classifier}</protocArtifact>
</configuration>
</plugin>

Expand Down
7 changes: 3 additions & 4 deletions src/main/java/com/mycompany/demo/App.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.http.converter.protobuf.ProtobufHttpMessageConverter;
import org.springframework.web.client.RestTemplate;

import java.util.Arrays;

/**
* This example demonstrates serving up REST payloads encoded using Google Protocol Buffers.
Expand All @@ -20,8 +23,4 @@ ProtobufHttpMessageConverter protobufHttpMessageConverter() {
return new ProtobufHttpMessageConverter();
}

@Bean
PlayerRepository playerRepository() {
return new PlayerRepositoryDemoImpl();
}
}
69 changes: 69 additions & 0 deletions src/main/java/com/mycompany/demo/HttpController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package com.mycompany.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.io.*;


@RestController
public class HttpController {

@Autowired
private PlayerRepository playerRepository;
@Autowired
private ImageRepository imageRepository;

/**
* {@code curl -v http://localhost:8080/players/1}
*/
@GetMapping("/players/{id}")
PlayerProtos.Player player(@PathVariable Integer id) {
return playerRepository.findById(id);
}

/**
* {@code curl -v http://localhost:8080/players}
*/
@GetMapping("/players")
@ResponseBody
PlayerProtos.PlayerList findAll() {
return playerRepository.findAll();
}

@PostMapping("/uploadImg")
void uploadImg(HttpServletRequest request) {
try {
ImageTest.Data data = ImageTest.Data.parseFrom(request.getInputStream());
imageRepository.uploadImage(data);
} catch (IOException e) {
e.printStackTrace();
}
}

@PostMapping("/addPlayer")
String addPlayer(HttpServletRequest request) {
try {
PlayerProtos.Player player = PlayerProtos.Player.parseFrom(request.getInputStream());
System.out.println(player);
System.out.println(player.getFullName());
return player.getFullName();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}

/**
* 使用httpclient测试,需要设置content-Type
* httppost.addHeader("Content-Type", "application/x-protobuf;charset=utf-8");
* @param player
*/
@PostMapping(value = "/addPlayer1")
// @PostMapping(value = "/addPlayer1", consumes = {"application/x-protobuf"}, produces = "application/x-protobuf")
void addPlayer1(@RequestBody PlayerProtos.Player player) {
System.out.println(player.getFullName());
}
}
9 changes: 9 additions & 0 deletions src/main/java/com/mycompany/demo/ImageRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.mycompany.demo;

/**
* Created by hfy on 2017/11/17.
*/
public interface ImageRepository {

void uploadImage(ImageTest.Data data);
}
59 changes: 59 additions & 0 deletions src/main/java/com/mycompany/demo/ImageRepositoryImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package com.mycompany.demo;

import com.google.protobuf.ByteString;
import org.springframework.stereotype.Service;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

/**
* Created by hfy on 2017/11/17.
*/
@Service
public class ImageRepositoryImpl implements ImageRepository {

@Override
public void uploadImage(ImageTest.Data data) {
ByteString photoData = data.getPhotoData();
if (photoData != null) {
byte[] bytes = photoData.toByteArray();
System.out.println(data.getName());
System.out.println(bytes.length);
// for (byte b : bytes) {
// System.out.println(b);
// }
writeToFile(bytes, data.getName());
}
}


private void writeToFile(byte[] bytes, String name) {
String path = "d:/" + name + ".jpg";
BufferedOutputStream outputStream = null;
try {
File newFile = new File(path);
if (newFile.exists()) {
boolean delete = newFile.delete();
if (!delete) {
System.out.println("删除文件失败!");
}
}
outputStream = new BufferedOutputStream(new FileOutputStream(newFile));
outputStream.write(bytes);
outputStream.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != outputStream) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

}
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
package com.mycompany.demo;

import org.springframework.stereotype.Service;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import static java.util.Arrays.asList;

@Service
public class PlayerRepositoryDemoImpl implements PlayerRepository {

Map<Integer, PlayerProtos.Player> players = new ConcurrentHashMap<>();
Expand Down
30 changes: 0 additions & 30 deletions src/main/java/com/mycompany/demo/PlayerRestController.java

This file was deleted.

11 changes: 11 additions & 0 deletions src/main/proto/imagetest.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
syntax = "proto3";

package com.mycompany.demo;
option java_package = "com.mycompany.demo";
option java_outer_classname = "ImageTest";


message Data {
string name = 1;
bytes photoData = 2;
}
17 changes: 16 additions & 1 deletion src/test/java/com/mycompany/demo/AppTest.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.mycompany.demo;

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
Expand All @@ -8,6 +9,8 @@
import org.springframework.http.ResponseEntity;
import org.springframework.test.context.junit4.SpringRunner;

import java.io.IOException;

import static org.assertj.core.api.Assertions.assertThat;

@RunWith(SpringRunner.class)
Expand All @@ -19,11 +22,23 @@ public class AppTest {

@Test
public void contextLoaded() {

ResponseEntity<PlayerProtos.Player> playerResponse = restTemplate.getForEntity(
"/players/2", PlayerProtos.Player.class);

System.out.println("player retrieved: " + playerResponse.toString());
assertThat(playerResponse.getBody().getShortName()).isEqualTo("Kohli");
}

@Test
public void testAddPlayer() throws IOException, InterruptedException {
PlayerProtos.Player player = PlayerProtos.Player.newBuilder().setFullName("中文测试").build();
ResponseEntity<String> stringResponseEntity = restTemplate.postForEntity("/addPlayer", player, String.class);
Assert.assertEquals("中文测试", stringResponseEntity.getBody());
}

@Test
public void testAddPlayer1() throws IOException, InterruptedException {
PlayerProtos.Player player = PlayerProtos.Player.newBuilder().setFullName("中文测试").build();
restTemplate.postForEntity("/addPlayer1", player, Void.class);
}
}