【问题标题】:RESTful jersey the requested resource is not availableRESTful jersey 请求的资源不可用
【发布时间】:2016-10-07 19:50:13
【问题描述】:

我正在开发一个 REST Web 服务,它应该能够根据 URL 参数使用 XML 进行响应。我有一个本地应用程序的第一个版本,因此我有一个初始化 XML 处理的 POJO 主类。问题是资源无法定位,可能是我把POJO main 方法放在Application 类里面做错了。此 URI 可以在 localhost:8090/org.CTAG.DATEX2REST 上运行,但如果您添加位置 URL 路径,它就不起作用了。

PD:我正在使用 jersey 框架、maven、JAXB 和 Tomcat8

已编辑:我已删除 Application 类,POJO 主现在是 ServletContextListener

休息课

package com.CTAG.rest;

import java.util.LinkedList;
import java.util.List;
import java.util.Objects;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import com.CTAG.core.Traslator;
import eu.datex2.schema._2_0._2_3.D2LogicalModel;
import eu.datex2.schema._2_0._2_3.Situation;
import eu.datex2.schema._2_0._2_3.SituationPublication;
import com.CTAG.filters.FilterByRoad;
@Path("/datex")
@Produces(MediaType.APPLICATION_XML)
public class DataExchange {

    private D2LogicalModel datex2 = Traslator.d2;

    @GET
    @Produces(MediaType.APPLICATION_XML)
    public Response getDatex() {

        return Response.ok(this.datex2).build();

    }

    @GET
    @Path("/{road}")
    public Response getDatexByRoad(@PathParam("road") String roadName){

        SituationPublication payLoad = (SituationPublication)this.datex2.getPayloadPublication();
        FilterByRoad filter = new FilterByRoad(payLoad.getSituation());
        List<Situation> filteredList = new LinkedList<>();
        filteredList.addAll(filter.filterByRoad(roadName));
        payLoad.setSituation(filteredList);
        this.datex2.setPayloadPublication(payLoad);

        return Response.ok(this.datex2).build();
    }
}

应用类

package com.CTAG.application;

import eu.datex2.schema._2_0._2_3.D2LogicalModel;
import eu.datex2.schema._2_0._2_3.SituationRecord;

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
import javax.xml.bind.JAXBException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerConfigurationException;

import com.CTAG.core.Traslator;

import static java.lang.Thread.sleep;

import java.io.IOException;
import java.net.URL;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * Configuration of the REST application. This class includes the resources and
 * configuration parameter used in the REST API of the application.
 *
 * @author Andoni Da Silva
 *
 */

@ApplicationPath("/rest")
public class ExchangeApplication extends Application{
    @Override
    public Set<Class<?>> getClasses() {
        return Stream.of(D2LogicalModel.class)
                .collect(Collectors.toSet());
    }

    //Old POJO main method
    public static void init() throws InterruptedException {

        try {
            Map<SituationRecord, Integer> map = new HashMap<> ();
            while (true) {

                URL url = new URL (" http://infocar.dgt.es/datex2/dgt/SituationPublication/all/content.xml");
                Map<SituationRecord, Integer> copia = map;
                map = Traslator.traslator (copia, url);
                sleep (120000);
                //Preubassleep(30000);
            }
        } catch (TransformerConfigurationException | JAXBException | ParserConfigurationException | IOException e) {

            e.printStackTrace ();

        }
    }
}

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    id="WebApp_ID" version="3.1">

    <display-name>CTAG DATEX2</display-name>

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>

    <servlet>
        <servlet-name>org.CTAG.DATEX2REST</servlet-name>
        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>jersey</servlet-name>
        <url-pattern>/rest*</url-pattern>
    </servlet-mapping>

</web-app>

【问题讨论】:

    标签: java rest maven jersey tomcat8


    【解决方案1】:

    看来你的 servlet 映射是错误的,应该如下所示,你需要告诉 servlet 从哪里选择带注释的类

    <servlet>
            <servlet-name>jersey</servlet-name>
            <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
             <init-param>
             <param-name>com.sun.jersey.config.property.packages</param-name>
             <param-value>com.CTAG.rest</param-value>
        </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
    
        <servlet-mapping>
            <servlet-name>jersey</servlet-name>
            <url-pattern>/rest/*</url-pattern>
        </servlet-mapping>
    

    【讨论】:

    • 这可能是问题的一部分,但并不能解决问题,谢谢。
    • 你正在尝试的 url 是什么?
    • localhost:8090/org.CTAG.DATEX2REST/rest/datex
    • 顺便说一句,你为什么使用 Application 类以及 servlet。我想只有其中之一。不是两者都
    • 您能解释一下吗?我是 RESTful 和 ws 的新手
    【解决方案2】:
    <!-- Auto scan REST service (false in case resteasy.resources is given ) -->
    <context-param>
        <param-name>resteasy.scan</param-name>
        <param-value>false</param-value>
    </context-param>
    
    <!-- this need same with resteasy servlet url-pattern -->
    <context-param>
        <param-name>resteasy.servlet.mapping.prefix</param-name>
        <param-value>/rest</param-value>
    </context-param>
    <context-param>
        <param-name>resteasy.resources</param-name>
        <param-value>com.test.rest.service.HelloWorldService</param-value>
    </context-param>
    <!-- <listener> <listener-class> org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap 
        </listener-class> </listener> -->
    
    <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>/rest/*</url-pattern>
    </servlet-mapping>
    

    【讨论】:

    • 这个答案是什么?
    【解决方案3】:

    我已经解决了这个问题,我的 web.xml 在错误的目录中,它必须在 WebContent/WEB_INF/web.xml 中,因此它被忽略了,因为事实上 mvn 没有如果未达到 web.xml,则失败。此外,POJO 主类被替换为 ServletContextListener 并且还删除了 Application 类。

    【讨论】:

      猜你喜欢
      • 2015-07-11
      • 1970-01-01
      • 2014-04-13
      • 1970-01-01
      • 2018-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-26
      相关资源
      最近更新 更多