resteasy簡單實例


1.建一個maven web項目

新建一個maven項目,next,第一個框不要勾選

選擇maven-archetype-webapp,建一個web項目

鍵入項目組織id與項目id

一般此時搭建的只是最基本的骨架,還缺了很多東西,我們可以自己按需求去增加。

右鍵項目,build path,編輯jre,選擇默認

web項目的基本構造就出來了

再新建目錄,在main和test下面新建resources,然后再build path里的source添加關聯

最后再增加服務器jboss的包,整個web項目框架就基本沒有報錯的搭建起來了

2.最基本的講完了,現在開始做一個resteasy的簡單實例。

2.1首先,配置pom.xml,為項目添加下載resteasy的jar,下面給出jar的配置版本(可去網上查看最新版本)

  <dependencies>
    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-jaxrs</artifactId>
        <version>2.2.1.GA</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.16.10</version>
    </dependency>
  </dependencies>

lombok是一個用來簡化代碼的工具,后面給出的代碼有用到,也可以不用,但要自己寫set,get及類的初始化

ps1:此時可能出現的錯誤,提示缺少依賴包,如下圖,解決辦法:右鍵maven---update project 一下,使新的包在本地生效,一般就能解決問題。

ps2:如果update項目后報JavaServer Faces 2.0 requires Dynamic Web Module 2.5 or newer之類的錯誤,就是你的web版本太舊,此時項目右鍵properties—project facets—Dynamic Web Module,修改為3.0的版本,一般就能解決。

ps3:如果在面版不能修改,此時,你就需要去底層修改web的版本了,首先更改maven生成的web.xml的web-app標簽內容,再去項目底層demo\.settings路徑下,修改org.eclipse.wst.common.project.facet.core.xml文件的配置,將其都改為3.0的版本。下面分別為舊的web.xml,新的web.xml,以及.core.xml的配置

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
</web-app>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
                         http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
                         version="3.0">

</web-app>

2.2配置web.xml,注冊resources的模式有三種:

2.2.1手動注冊resources的模式

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
    <display-name>Archetype Created Web Application</display-name>
    <!-- 1. 使用手動注冊resources的模式,必須啟動ResteasyBootstrap監聽 -->
    <!-- 要發布成resteasy服務的資源類 -->
    <context-param>  
             <param-name>resteasy.resources</param-name>  
             <param-value>com.fengyuan.restapi.UserService</param-value>  
    </context-param>
    
    <!-- 對應<servlet-mapping>的url,必須設置prefix做初始過濾,訪問例子:http://localhost:8080/demo/service/userservice/users -->
    <context-param>  
             <param-name>resteasy.servlet.mapping.prefix</param-name>  
             <param-value>/service</param-value>  
    </context-param>
    
    <!-- 啟動服務監聽器,初始化resteasy核心組件 -->
    <listener>  
        <listener-class>  
                 org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap  
        </listener-class>  
    </listener>
    
    <!-- url服務請求的分發控制器 -->
    <servlet>  
             <servlet-name>resteasy-servlet</servlet-name>  
             <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
    </servlet>
    <servlet-mapping>  
             <servlet-name>resteasy-servlet</servlet-name>  
             <url-pattern>/service/*</url-pattern>  
    </servlet-mapping>
   
</web-app>

2.2.2手動指定Application的模式

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
    <display-name>Archetype Created Web Application</display-name>
    <!-- 方法2:不啟用手動注冊resources的模式和ResteasyBootstrap監聽,創建一個類並且繼承javax.ws.rs.core.Application,並且手動增加REST服務 -->

    
    <!-- 對應<servlet-mapping>的url,必須設置prefix做初始過濾,訪問例子:http://localhost:8080/demo/service/userservice/users -->
    <context-param>  
             <param-name>resteasy.servlet.mapping.prefix</param-name>  
             <param-value>/service</param-value>  
    </context-param>    
    <!-- url服務請求的分發控制器 -->
    <servlet>  
             <servlet-name>resteasy-servlet</servlet-name>  
             <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
             <init-param>
                 <param-name>javax.ws.rs.Application</param-name>
                 <param-value>com.mk.rest.RestApplication</param-value>
             </init-param>  
    </servlet>
    <servlet-mapping>  
             <servlet-name>resteasy-servlet</servlet-name>  
             <url-pattern>/service/*</url-pattern>  
    </servlet-mapping>
   
</web-app>

2.2.3自動Scan的模式,我使用這種模式,啟動項目時,會報類似下面的錯誤

17:56:16,506 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/demo]] (MSC service thread 1-6) Exception sending context initialized event to listener instance of class org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap: java.lang.RuntimeException: Unable to find a public constructor for class org.jboss.resteasy.core.AsynchronousDispatcher
    at org.jboss.resteasy.plugins.server.resourcefactory.POJOResourceFactory.registered(POJOResourceFactory.java:35) [resteasy-jaxrs-2.3.2.Final.jar:]
    at org.jboss.resteasy.core.ResourceMethodRegistry.addResourceFactory(ResourceMethodRegistry.java:121) [resteasy-jaxrs-2.3.2.Final.jar:]
    at org.jboss.resteasy.core.ResourceMethodRegistry.addResourceFactory(ResourceMethodRegistry.java:107) [resteasy-jaxrs-2.3.2.Final.jar:]
    at org.jboss.resteasy.core.ResourceMethodRegistry.addResourceFactory(ResourceMethodRegistry.java:84) [resteasy-jaxrs-2.3.2.Final.jar:]
    at org.jboss.resteasy.core.ResourceMethodRegistry.addPerRequestResource(ResourceMethodRegistry.java:73) [resteasy-jaxrs-2.3.2.Final.jar:]
    at org.jboss.resteasy.spi.ResteasyDeployment.registration(ResteasyDeployment.java:367) [resteasy-jaxrs-2.3.2.Final.jar:]
    at org.jboss.resteasy.spi.ResteasyDeployment.start(ResteasyDeployment.java:225) [resteasy-jaxrs-2.3.2.Final.jar:]
    at org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap.contextInitialized(ResteasyBootstrap.java:28) [resteasy-jaxrs-2.3.2.Final.jar:]
    at org.apache.catalina.core.StandardContext.contextListenerStart(StandardContext.java:3392) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:3850) [jbossweb-7.0.13.Final.jar:]
    at org.jboss.as.web.deployment.WebDeploymentService.start(WebDeploymentService.java:90) [jboss-as-web-7.1.1.Final.jar:7.1.1.Final]
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811)
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_80]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_80]
    at java.lang.Thread.run(Thread.java:745) [rt.jar:1.7.0_80]

17:56:16,567 ERROR [org.apache.catalina.core.StandardContext] (MSC service thread 1-6) Error listenerStart
17:56:16,568 ERROR [org.apache.catalina.core.StandardContext] (MSC service thread 1-6) Context [/demo] startup failed due to previous errors
17:56:16,603 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-6) MSC00001: Failed to start service jboss.web.deployment.default-host./demo: org.jboss.msc.service.StartException in service jboss.web.deployment.default-host./demo: JBAS018040: Failed to start context
    at org.jboss.as.web.deployment.WebDeploymentService.start(WebDeploymentService.java:95)
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_80]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_80]
    at java.lang.Thread.run(Thread.java:745) [rt.jar:1.7.0_80]

17:56:16,817 INFO  [org.jboss.as.server] (DeploymentScanner-threads - 2) JBAS015870: Deploy of deployment "demo.war" was rolled back with failure message {"JBAS014671: Failed services" => {"jboss.web.deployment.default-host./demo" => "org.jboss.msc.service.StartException in service jboss.web.deployment.default-host./demo: JBAS018040: Failed to start context"}}
17:56:16,872 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-8) JBAS015877: Stopped deployment demo.war in 59ms
17:56:16,873 INFO  [org.jboss.as.controller] (DeploymentScanner-threads - 2) JBAS014774: Service status report
JBAS014777:   Services which failed to start:      service jboss.web.deployment.default-host./demo: org.jboss.msc.service.StartException in service jboss.web.deployment.default-host./demo: JBAS018040: Failed to start context

17:56:16,875 ERROR [org.jboss.as.server.deployment.scanner] (DeploymentScanner-threads - 1) {"JBAS014653: Composite operation failed and was rolled back. Steps that failed:" => {"Operation step-2" => {"JBAS014671: Failed services" => {"jboss.web.deployment.default-host./demo" => "org.jboss.msc.service.StartException in service jboss.web.deployment.default-host./demo: JBAS018040: Failed to start context"}}}}

原因不明,下面我的自動掃描配置,希望有大神能指點下

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
    <display-name>Archetype Created Web Application</display-name>
    <!-- 方法3: 使用自動Scan的模式,必須啟動ResteasyBootstrap監聽,報錯,原因不明 -->
    <context-param> 
        <param-name>resteasy.scan</param-name> 
        <param-value>true</param-value> 
    </context-param>
    
    <!-- 對應<servlet-mapping>的url,必須設置prefix做初始過濾,訪問例子:http://localhost:8080/wang/service/userservice/users -->
    <context-param>  
             <param-name>resteasy.servlet.mapping.prefix</param-name>  
             <param-value>/service</param-value>  
    </context-param>
    
    <!-- 啟動服務監聽器,初始化resteasy核心組件 -->
    <listener>  
        <listener-class>  
                 org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap  
        </listener-class>  
    </listener>
    
    <!-- url服務請求的分發控制器 -->
    <servlet>  
             <servlet-name>resteasy-servlet</servlet-name>  
             <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
    </servlet>
    <servlet-mapping>  
             <servlet-name>resteasy-servlet</servlet-name>  
             <url-pattern>/service/*</url-pattern>  
    </servlet-mapping>
   
</web-app>

2.3下面給出簡單的java類

 新建一個簡單的User類,使用了lombok插件注解(可以簡化代碼,自動生成set,get等方法),lombok的安裝方法自行百度,安裝后還要在pxm.xml里配置,見上文

package com.fengyuan.domain;

import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
public class User {
    private String name;
    private int age;
    private String tel;
}

要發布的資源類UserService

package com.fengyuan.restapi;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import com.fengyuan.domain.User;

@Path("userservice") // 服務路徑
public class UserService {
    /**
     * 初始化三個用戶數據,存入map中,key為用戶id,value為用戶對象
     */
    static Map<Integer, User> userMap = new HashMap<>();

    static { 
        User user1 = new User("Lee", 24, "138***");
        userMap.put(1, user1);
        User user2 = new User("Cathy", 25, "188***");
        userMap.put(2, user2);
        User user3 = new User("Aaron", 26, "186***");
        userMap.put(3, user3);
    }

    /**
     * 獲取指定id的用戶
     * 
     * @param id
     * @return
     */
    @GET
    @Path("user/{id}") // 具體服務的路徑, id是入參
    @Produces("application/json") // 返回的格式
    public User getById(@PathParam("id") Integer id) {
        return (User) userMap.get(id);
    }

    /**
     * 以json格式返回所有用戶
     * 
     * @return
     */
    @GET
    @Path("users")
    @Produces("application/json")
    public List<User> getUsers() {
        List<User> userList = new ArrayList<User>();
        for (Entry<Integer, User> user : userMap.entrySet()) {
            userList.add(user.getValue());
        }
        return userList;
    }
}

測試結果

下面給出Application的模式的代碼

package com.mk.rest;

import java.util.HashSet;
import java.util.Set;
import com.fengyuan.restapi.UserService;

public class RestApplication extends javax.ws.rs.core.Application{

    private Set<Object> singletons = new HashSet<Object>();   
    /*在這里增加資源類*/
    public RestApplication () {
        singletons.add(new MessageRestService());
        singletons.add(new UserService());
    }
    @Override
    public Set<Object> getSingletons() {
        return singletons;
    }
}

 

后續會邊學習邊給出resteasy的其他復雜實例,歡迎隨時指正~~~~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM