diff --git a/pom.xml b/pom.xml index 5bce9f2..8fa957d 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 org.springframework - gs-rest-service + springboot-protobuf 0.1.0 @@ -18,7 +18,11 @@ UTF-8 UTF-8 - 3.2.0 + + + + + 3.4.0 1.4 1.8 @@ -65,6 +69,25 @@ test + + + + + + + + + + + + + + + + + + + @@ -72,7 +95,7 @@ kr.motd.maven os-maven-plugin - 1.3.0.Final + 1.5.0.Final @@ -96,7 +119,7 @@ - com.google.protobuf:protoc:3.0.0:exe:${os.detected.classifier} + com.google.protobuf:protoc:${protobuf.version}:exe:${os.detected.classifier} diff --git a/src/main/java/com/mycompany/demo/App.java b/src/main/java/com/mycompany/demo/App.java index c3a5016..c2fa868 100644 --- a/src/main/java/com/mycompany/demo/App.java +++ b/src/main/java/com/mycompany/demo/App.java @@ -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. @@ -20,8 +23,4 @@ ProtobufHttpMessageConverter protobufHttpMessageConverter() { return new ProtobufHttpMessageConverter(); } - @Bean - PlayerRepository playerRepository() { - return new PlayerRepositoryDemoImpl(); - } } diff --git a/src/main/java/com/mycompany/demo/HttpController.java b/src/main/java/com/mycompany/demo/HttpController.java new file mode 100644 index 0000000..73d96f1 --- /dev/null +++ b/src/main/java/com/mycompany/demo/HttpController.java @@ -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()); + } +} diff --git a/src/main/java/com/mycompany/demo/ImageRepository.java b/src/main/java/com/mycompany/demo/ImageRepository.java new file mode 100644 index 0000000..43b155a --- /dev/null +++ b/src/main/java/com/mycompany/demo/ImageRepository.java @@ -0,0 +1,9 @@ +package com.mycompany.demo; + +/** + * Created by hfy on 2017/11/17. + */ +public interface ImageRepository { + + void uploadImage(ImageTest.Data data); +} diff --git a/src/main/java/com/mycompany/demo/ImageRepositoryImpl.java b/src/main/java/com/mycompany/demo/ImageRepositoryImpl.java new file mode 100644 index 0000000..160320b --- /dev/null +++ b/src/main/java/com/mycompany/demo/ImageRepositoryImpl.java @@ -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(); + } + } + } + } + +} diff --git a/src/main/java/com/mycompany/demo/PlayerRepositoryDemoImpl.java b/src/main/java/com/mycompany/demo/PlayerRepositoryDemoImpl.java index 39ce893..786e572 100644 --- a/src/main/java/com/mycompany/demo/PlayerRepositoryDemoImpl.java +++ b/src/main/java/com/mycompany/demo/PlayerRepositoryDemoImpl.java @@ -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 players = new ConcurrentHashMap<>(); diff --git a/src/main/java/com/mycompany/demo/PlayerRestController.java b/src/main/java/com/mycompany/demo/PlayerRestController.java deleted file mode 100644 index b54830b..0000000 --- a/src/main/java/com/mycompany/demo/PlayerRestController.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.mycompany.demo; - -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RestController; - - -@RestController -@RequiredArgsConstructor -class PlayerRestController { - - private final PlayerRepository playerRepository; - - /** - * {@code curl -v http://localhost:8080/players/1} - */ - @GetMapping("/players/{id}") - PlayerProtos.Player player(@PathVariable Integer id) { - return this.playerRepository.findById(id); - } - - /** - * {@code curl -v http://localhost:8080/players} - */ - @GetMapping("/players") - PlayerProtos.PlayerList findAll() { - return this.playerRepository.findAll(); - } -} diff --git a/src/main/proto/imagetest.proto b/src/main/proto/imagetest.proto new file mode 100644 index 0000000..b5d88dc --- /dev/null +++ b/src/main/proto/imagetest.proto @@ -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; +} \ No newline at end of file diff --git a/src/test/java/com/mycompany/demo/AppTest.java b/src/test/java/com/mycompany/demo/AppTest.java index 78f67d8..ed96164 100644 --- a/src/test/java/com/mycompany/demo/AppTest.java +++ b/src/test/java/com/mycompany/demo/AppTest.java @@ -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; @@ -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) @@ -19,11 +22,23 @@ public class AppTest { @Test public void contextLoaded() { - ResponseEntity 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 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); + } }