Spring boot jersey + Jboss注意點

原本打算用spring mvc的蠢涝,但想想配置太麻煩派阱,所以就選擇了spring boot。因公司要求要采用JAX-RS規(guī)范揩环,所以用了jersey搔弄。 Spring boot已支持jersey,且提供了專門的依賴:spring-boot-start-jersey丰滑,所以整合起來比較簡單顾犹。

Spring boot:2.0.0.RELEASE

JDK:1.8

Jboss:7.0.4

maven:3.3.3

部署:打成war包,發(fā)布到jboss

pom.xml

因為要打成war包吨枉,所以在pom.xml中加上如下代碼:
<packaging>war</packaging>

因為有父modules蹦渣,所以用下面的方式引入spring boot的父依賴,同時也附上了一些主要的依賴貌亭,詳細介紹可以參考官網柬唯。

<dependencyManagement>
        <dependencies>
        <dependency>
            <!-- Import dependency management from Spring Boot -->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.0.0.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <!-- Add typical dependencies for a web application -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jersey</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <!-- 因為要部署到jboss,所以要把內置的tomcat去掉 -->
        <!-- 官網的描述:To build a war file that is both executable and deployable into an external container, you need to mark the embedded container dependencies as “provided”-->
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

application.properties

路徑:src/java/resources
Spring boot的默認配置文件是application.properties圃庭。

數據源是用jndi锄奢,下面是spring boot中jndi的配置

spring.datasource.jndi-name=java:jboss/datasources/customers

引入了jersey, 可以使用下面的配置來定義jersey請求的路徑

# Path that serves as the base URI for the application.
spring.jersey.application-path=/jersey

Spring boot自身提供了一些Endpoint, 可以利用這些Endpoint可以查看Spring boot一些自動配置的信息剧腻、beans拘央、health等等,幫助開發(fā)者學習Spring boot的一些自動配置及監(jiān)控我們的Application书在。默認的路徑是/actuator灰伟,如:/actuator/health, /actuator/beans儒旬。有些Endpoint是安全控制的栏账,需要特殊配置,具體可以參考官網栈源〉簿簦可以在properties里面配置下面參數來改變默認路徑:

management.endpoints.web.base-path=/manage

如果要用這些自帶的Endpoint,需要在pom.xml中加入下面的依賴:

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

介紹這2個路徑的配置是為了引入一個問題甚垦,在Spring boot 2.0.0之前的版本茶鹃,自帶的Endpoint默認路徑是/ *, 而jersey的默認路徑也是/ *。自帶的Endpoint是基于Spring MVC dispatcher艰亮,jersey是基于jersey dispatcher. 如果2個根路徑是一樣的話闭翩,Spring boot就有可能不知道請求要基于哪個dispatcher來處理迄埃,進而報錯。最新版本應該沒有這個問題调俘,因為Spring boot已經給自帶的Endpoint的默認路徑改為/actuator伶棒。

Jersey注冊自定義的Endpoint

Jersey注入

@Component
public class JerseyConfig extends ResourceConfig {
    public JerseyConfig() {
        register(Endpoint.class);
    }
}

Endpoint

基于目前的配置,該URL:host:port/[projectname]/jersy/hello

@Component
@Path("/hello")
public class Endpoint {
    @GET
    public String message() {
        return "Hello";
    }
}

啟動類

下面這段是引處官網的肤无,我的理解:沒有用內置的tomcat做部署,所以得重寫configure方法宛渐,把外部的web容器上下文引入竞漾。

The first step in producing a deployable war file is to provide a SpringBootServletInitializer subclass and override its configure method. Doing so makes use of Spring Framework’s Servlet 3.0 support and lets you configure your application when it is launched by the servlet container. Typically, you should update your application’s main class to extend SpringBootServletInitializer, as shown in the following example:

@SpringBootApplication
public class Application extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }
    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }
}

Spring Boot會自動掃描@SpringBootApplication所在類的同級包及下級包里的所有bean业岁,所以建議啟動類放在最外層的包下。

jboss相關配置

位置:src/main/webapp/WEB-INF

jboss-web.xml

配置web context信息笔时,web context是URL的根目錄。若不配仗岸,默認項目名為web context允耿。 如下是配置的例子,那么根URL為:host:port/demo/

<!DOCTYPE jboss-web PUBLIC "-//JBoss//DTD Web Application 5.0//EN"  
"http://www.jboss.org/j2ee/dtd/jboss-web_5_0.dtd">  
<jboss-web>  
    <context-root>demo</context-root> 
</jboss-web>    

jboss-deployment-structure.xml

jboss中扒怖,自帶了一些jar包较锡,spring boot項目中會用到一些jboss中自帶的jar包,但項目中用的jar版本可能和jboss中自帶的jar不匹配盗痒,代碼部署到jboss蚂蕴,啟動過程中會報一些類找不到的錯誤。

有兩種解決辦法:

1. 改jboss中的jar包俯邓,使之與項目匹配

2. 在項目中添加jboss-deployment-structure.xml骡楼,exclude jboss中那些版本不匹配的jar包,再在項目中的pom.xml添加exclude掉的正確版本的jar依賴:

<?xml version="1.0" encoding="UTF-8"?>    
<jboss-deployment-structure>    
    <deployment>    
        <!-- Exclusions allow you to prevent the server from automatically adding some dependencies     -->    
        <exclusions>   
          <module name=“com.fasterxml.jackson.core.jackson-core” />
          <module name=“com.fasterxml.jackson.core.jackson-annotations” />
          <module name=“com.fasterxml.jackson.core.jackson-data bind” />
          <module name=“com.fasterxml.jackson.jaxrs.jackson-jaxrs-Jason-provider” />
          <module name=“org.jboss.resteasy.resteasy-jackson2-provider” />
          <module name=“org.jboss.resteasy.resteasy-jackson-provider” />
          <module name="javax.ws.rs.api"/>      
        </exclusions>    
    </deployment>    
</jboss-deployment-structure>   

當然看成,這兩種方法可能都會引起其他相關聯(lián)jar的版本沖突君编,需要一一排查

調用ejb

在代碼里調用remote ejb跨嘉,啟動jboss時川慌,發(fā)現一些ClassCastException。這個異常祠乃,還是因為包沖突引起的梦重。
在上一步中,exclude掉了jboss中自帶的javax.ws.rs-api亮瓷,在pom.xml里又引入了該jar的2.1版本琴拧,導致jboss中ejb用到的相關class與新版本的javax.ws.rs-api中的class沖突。
因不想再處理這些包沖突嘱支,也因jboss中的ejb還有其他application在用蚓胸,所以干脆降低了springboot版本為1.5.8挣饥,去掉上一步中的<module name="javax.ws.rs.api"/>這句代碼(不引入新版本jar,直接使用jboss自帶的javax.ws.rs-api.jar)沛膳,問題就解決了扔枫。

總結:經常解決完問題后,過些日子就忘記了锹安,年紀大了短荐,不得不服老呀!所以整理一下記下來叹哭,也許能利己也利各方碼農呢...

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末忍宋,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子风罩,更是在濱河造成了極大的恐慌糠排,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,599評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泊交,死亡現場離奇詭異乳讥,居然都是意外死亡,警方通過查閱死者的電腦和手機廓俭,發(fā)現死者居然都...
    沈念sama閱讀 90,629評論 3 385
  • 文/潘曉璐 我一進店門云石,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人研乒,你說我怎么就攤上這事”荆” “怎么了?”我有些...
    開封第一講書人閱讀 158,084評論 0 348
  • 文/不壞的土叔 我叫張陵铅乡,是天一觀的道長烈菌。 經常有香客問我,道長挚赊,這世上最難降的妖魔是什么济瓢? 我笑而不...
    開封第一講書人閱讀 56,708評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮蔑鹦,結果婚禮上,老公的妹妹穿的比我還像新娘嚎朽。我一直安慰自己,他們只是感情好火鼻,可當我...
    茶點故事閱讀 65,813評論 6 386
  • 文/花漫 我一把揭開白布魁索。 她就那樣靜靜地躺著,像睡著了一般尝偎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上致扯,一...
    開封第一講書人閱讀 50,021評論 1 291
  • 那天抖僵,我揣著相機與錄音,去河邊找鬼耍群。 笑死找筝,一個胖子當著我的面吹牛,可吹牛的內容都是我干的曹抬。 我是一名探鬼主播,決...
    沈念sama閱讀 39,120評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼谤民,長吁一口氣:“原來是場噩夢啊……” “哼赖临!你這毒婦竟也來了胞锰?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,866評論 0 268
  • 序言:老撾萬榮一對情侶失蹤顺饮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后兼雄,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,308評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡块攒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,633評論 2 327
  • 正文 我和宋清朗相戀三年囱井,在試婚紗的時候發(fā)現自己被綠了趣避。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,768評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡住练,死狀恐怖,靈堂內的尸體忽然破棺而出讲逛,到底是詐尸還是另有隱情岭埠,我是刑警寧澤,帶...
    沈念sama閱讀 34,461評論 4 333
  • 正文 年R本政府宣布括饶,位于F島的核電站,受9級特大地震影響图焰,放射性物質發(fā)生泄漏蹦掐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,094評論 3 317
  • 文/蒙蒙 一藤滥、第九天 我趴在偏房一處隱蔽的房頂上張望社裆。 院中可真熱鬧,春花似錦、人聲如沸榄攀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽违寞。三九已至,卻和暖如春憔狞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瘾敢。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評論 1 267
  • 我被黑心中介騙來泰國打工尿这, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人碟摆。 一個月前我還...
    沈念sama閱讀 46,571評論 2 362
  • 正文 我出身青樓叨橱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親罗洗。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,666評論 2 350

推薦閱讀更多精彩內容