【问题标题】:Tomcat unable to find resource for rest web serviceTomcat 找不到 REST Web 服务的资源
【发布时间】:2018-07-13 17:11:16
【问题描述】:

我看到过类似的问题here,但该解决方案对我不起作用,所以我认为我的问题不同。

我已经使用 netbeans 创建了一个简单的 rest 服务,当我从 netbeans 中部署它时,它可以在 url http://localhost:8080/callback/callback/test 上运行,但是一旦我构建了一个 war 文件并将它部署在同一个 Tomcat 实例中,它就会返回错误 404 resource not成立。我不确定该怎么做才能让 Tomcat 识别 URL。

我的应用配置:

import java.util.Set;
import javax.ws.rs.core.Application;

@javax.ws.rs.ApplicationPath("callback")
public class ApplicationConfig extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> resources = new java.util.HashSet<>();
        addRestResourceClasses(resources);
        return resources;
    }

    private void addRestResourceClasses(Set<Class<?>> resources) {
        resources.add(com.orig.callback.Origafric.class);
    }

}

我的服务等级:

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.ws.rs.Produces;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.QueryParam;


@Path("/test")
public class Origafric {


    public Origafric() {
    }

    /**
     * Retrieves representation of an instance of com.orig.callback.Origafric
     *
     * @param provider
     * @param clientAccount
     * @param productName
     * @param phoneNumber
     * @param value
     * @param providerMetadata
     * @return an instance of java.lang.String
     * @throws java.io.IOException
     */
    @GET
    @Produces("application/json")
    public List<ValidationResult>  getTransactions(@QueryParam("provider") String provider,
            @QueryParam("clientAccount") String clientAccount, @QueryParam("productName") String productName,
            @QueryParam("phoneNumber") String phoneNumber, @QueryParam("value") String value,
            @QueryParam("providerMetadata") String providerMetadata) throws IOException {
        List<ValidationResult> list = new ArrayList<>();
        ValidationResult res = new ValidationResult();
        res.setProvider(provider);
        res.setClientAccount(clientAccount);
        res.setProductName(productName);
        res.setPhoneNumber(phoneNumber);
        res.setValue(value);
        res.setProviderMetadata(providerMetadata);
        list.add(res);
        String homeDir = System.getProperty("user.home") + File.separator + "callback";
        File f = new File(homeDir);
        if (!f.exists()) {
            f.mkdir();
        }
        File logfile = new File(f.getAbsolutePath() + File.separator + "results.log");
        FileWriter out = new FileWriter(logfile, true);
        for (ValidationResult el : list) {
            out.write(el.getProvider() + "\n");
            out.write(el.getClientAccount() + "\n");
            out.write(el.getProductName() + "\n");
            out.write(el.getPhoneNumber() + "\n");
            out.write(el.getValue() + "\n");
            out.write(el.getProviderMetadata() + "\n");
            out.flush();
        }
        return list;
    }

}

还有我的 web.xml

<?xml version="1.0" encoding="UTF-8"?>

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

    <display-name>RestExample</display-name>
    <servlet>
        <servlet-name>Jersey REST Service</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>de.jay.jersey.first</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey REST Service</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
</web-app>

ValidationResult 是我价值观的吸气剂。我在这里错过了什么?

我的图书馆目录:

我的战争库目录:

【问题讨论】:

  • war文件的名称是什么?您将其命名为 ROOT.war 对吗?
  • 不,war文件是callback.war
  • 如何部署 WAR 文件?马文? Tomcat Web 应用程序管理器?
  • @braunpet Tomcat Web 应用程序管理器。
  • 我猜想WAR文件中缺少库。您能否扩展您的问题以显示WEB-INF/lib 的内容。请仔细检查部署 WAR 文件是否成功。您无法使用 Web App Manager 重新部署。

标签: java rest tomcat netbeans jax-rs


【解决方案1】:

请查看您的 web.xml 配置

  <servlet-mapping>
        <servlet-name>Jersey REST Service</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>

根据上面的配置,你的 URL 映射是 /rest 但在 url 中没有可用的“rest”。

你能用 * 更改 servlet 映射并尝试吗,

<servlet-mapping>
        <servlet-name>Jersey REST Service</servlet-name>
        <url-pattern>/*</url-pattern>
</servlet-mapping>

【讨论】:

    【解决方案2】:

    只需将 URL 更改为 http://localhost:8080/callback/test

    这似乎是一条清晰的道路。我不明白您如何通过发布的 URL 访问它。

    【讨论】:

      猜你喜欢
      • 2019-06-06
      • 1970-01-01
      • 1970-01-01
      • 2020-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多