怎么应用Protobuf 和Jersy 打造Rest Service

怎么应用Protobuf 和Jersy 打造Rest Service,第1张

如何应用Protobuf 和Jersy 打造Rest Service

我使用的是Maven Project,所以

1。第一步加入Maven Dependency。

<dependency>

<groupId>com.sun.jersey</groupId>

<artifactId>jersey-server</artifactId>

<version>1.10</version>

</dependency>

<dependency>

<groupId>com.sun.jersey</groupId>

<artifactId>jersey-client</artifactId>

<version>1.10</version>

</dependency>

<dependency>

<groupId>com.google.protobuf</groupId>

<artifactId>protobuf-java</artifactId>

<version>2.4.1</version>

</dependency>

2。 然后,加入ant plugin来帮助我们产生protobuf 的java bean。

<build>

<plugins>

<plugin>

<artifactId>maven-antrun-plugin</artifactId>

<executions>

<execution>

<id>generate-sources</id>

<phase>generate-sources</phase>

<goals>

<goal>run</goal>

</goals>

<configuration>

<tasks>

<mkdir dir='target/generated-sources' />

<exec executable='protoc'>

<arg value='--java_out=target/generated-sources' />

<arg value='src/main/resources/addressbook.proto' />

</exec>

</tasks>

<sourceRoot>target/generated-sources</sourceRoot>

</configuration>

</execution>

</executions>

</plugin>

</plugins>

<pluginManagement>

<plugins>

<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->

<plugin>

<groupId>org.eclipse.m2e</groupId>

<artifactId>lifecycle-mapping</artifactId>

<version>1.0.0</version>

<configuration>

<lifecycleMappingMetadata>

<pluginExecutions>

<pluginExecution>

<pluginExecutionFilter>

<groupId>

org.apache.maven.plugins

</groupId>

<artifactId>

maven-antrun-plugin

</artifactId>

<versionRange>[1.3,)</versionRange>

<goals>

<goal>run</goal>

</goals>

</pluginExecutionFilter>

<action>

<ignore></ignore>

</action>

</pluginExecution>

</pluginExecutions>

</lifecycleMappingMetadata>

</configuration>

</plugin>

</plugins>

</pluginManagement>

</build>

3。 创建addressbook.proto文件

package tutorial

option java_package = "com.sampullara.jaxrsprotobuf.tutorial"

option java_outer_classname = "AddressBookProtos"

message Person {

required string name = 1

required int32 id = 2

optional string email = 3

enum PhoneType {

MOBILE = 0

HOME = 1

WORK = 2

}

message PhoneNumber {

required string number = 1

optional PhoneType type = 2 [default = HOME]

}

repeated PhoneNumber phone = 4

}

message AddressBook {

repeated Person person = 1

}

4。 运行mvn generate-sources命令来生成AddressBookProtos.java文件。

5。创建rest server端代码AddressBookService.java

package com.sampullara

import javax.ws.rs.Consumes

import javax.ws.rs.GET

import javax.ws.rs.POST

import javax.ws.rs.Path

import javax.ws.rs.Produces

import com.sampullara.jaxrsprotobuf.tutorial.AddressBookProtos

@Path("/person")

public class AddressBookService {

@GET

@Produces("application/x-protobuf")

public AddressBookProtos.Person getPerson() {

return AddressBookProtos.Person.newBuilder()

.setId(1)

.setName("Sam")

.setEmail("sam@sampullara.com")

.addPhone(AddressBookProtos.Person.PhoneNumber.newBuilder()

.setNumber("415-555-1212")

.setType(AddressBookProtos.Person.PhoneType.MOBILE)

.build())

.build()

}

@POST

@Consumes("application/x-protobuf")

@Produces("application/x-protobuf")

public AddressBookProtos.Person reflect(AddressBookProtos.Person person) {

return person

}

}

6。创建ProtobufProviders.java文件处理protobuf对象序列化。

package com.sampullara

import com.google.protobuf.GeneratedMessage

import com.google.protobuf.Message

import javax.ws.rs.Consumes

import javax.ws.rs.Produces

import javax.ws.rs.WebApplicationException

import javax.ws.rs.core.MediaType

import javax.ws.rs.core.MultivaluedMap

import javax.ws.rs.ext.MessageBodyReader

import javax.ws.rs.ext.MessageBodyWriter

import javax.ws.rs.ext.Provider

import java.io.ByteArrayOutputStream

import java.io.IOException

import java.io.InputStream

import java.io.OutputStream

import java.lang.annotation.Annotation

import java.lang.reflect.Method

import java.lang.reflect.Type

import java.util.Map

import java.util.WeakHashMap

某一天把spring-boot从1.3.6版本升级到1.4.3版本,然后在使用 java -jar uber.jar 运行启动项目的时候会出现

的异常

springboot 1.5.2

jersey 2.25.1

spring-boot升级到1.4+ 以后,spring-boot专门用来打包的maven plugin对目录结构进行了改变,如果使用了jersey来代替springmvc作为restful的方案,然后并且自己在生成的JerseyConfig类里面,通过 package() 函数来指定要扫描的包的路径的话,会导致找不到对应的路径,从而导致了出现 java.io.FileNotFoundException 的异常

网上一搜, 果然有很多相关的提问, 其中官方网站的升级wiki里面,也说了这个问题,并且给出了解决方案:

http://docs.spring.io/spring-boot/docs/1.5.x/reference/htmlsingle/#howto-extract-specific-libraries-when-an-executable-jar-runs

但是,按照这个方案进行配置,修改了相关的jar的坐标,但是没有效果(可能是我配置错误,如果有人知道如何通过配置,麻烦告知,十分感谢)

然后没有办法,只能找其他的解决方案

既然是 package() 函数来指定扫描包的时候找不到对应的路径,那就替换这个方法,最终使用了

来替换了传统的 package() 的方式,然后打包、运行。 可以看到项目成功启动了,并且简单的接口也可以访问了。

不过接下来需要进一步验证是否能在其他环境正常运行。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11271602.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-14
下一篇2023-05-14

发表评论

登录后才能评论

评论列表(0条)

    保存