Java REST ful客户端代码有问题 - java

我正在尝试在Java中创建REST-ful Web服务。
此REST-ful Web服务包含Hibernate配置和Rest-ful配置。
实际上,Java Web服务运行良好。但是当我尝试执行该Web服务的客户端代码时。

正在使用的jar文件是

activation
antlr-2.7.6
asm-3.1
asm-attrs
cglib-nodep
commons-collections-2.1.1
commons-fileupload-1.2.1
commons-io-1.3.2
commons-logging-1.1
dom4j-1.6.1
ehcache-1.2.3
ejb3-persistence
grizzly-servlet-webserver-1.7.3.2
hibernate-annotations
hibernate-commons-annotations
hibernate-entitymanager
hibernate-tools
hibernate3
http
javassist
jaxb-api
jaxb-impl
jaxb-xjc
jdbc2_0-stdext
jdom-1.0
jersey-core-1.7
jersey-server-1.7
jersey-spring
jersey
jettison-1.0-RC1
jsr173_api
jsr311-api
jta
mysql-connector-java-5.1.12-bin
osgi
rome-0.9
wadl2java

我的问题是

Exception in thread "main" java.lang.NoSuchMethodError: com.sun.jersey.spi.inject.InjectableProviderContext.getInjectable(Ljava/lang/Class;Lcom/sun/jersey/spi/service/ComponentContext;Ljava/lang/annotation/Annotation;Ljava/lang/Object;Ljava/util/List;)Lcom/sun/jersey/spi/inject/Injectable;
        at com.sun.jersey.spi.service.ComponentConstructor.getConstructor(ComponentConstructor.java:139)
        at com.sun.jersey.impl.application.ComponentProviderCache.getComponent(ComponentProviderCache.java:177)
        at com.sun.jersey.impl.application.ComponentProviderCache.getProvidersAndServices(ComponentProviderCache.java:122)
        at com.sun.jersey.impl.application.MessageBodyFactory.getProviderMap(MessageBodyFactory.java:133)
        at com.sun.jersey.impl.application.MessageBodyFactory.initReaders(MessageBodyFactory.java:107)
        at com.sun.jersey.impl.application.MessageBodyFactory.init(MessageBodyFactory.java:102)
        at com.sun.jersey.api.client.Client.<init>(Client.java:284)
        at com.sun.jersey.api.client.Client.<init>(Client.java:209)
        at com.sun.jersey.api.client.Client.create(Client.java:429)
        at pack1.client.Test.main(Test.java:20)

客户端Java代码为

package pack1.client;

import java.net.URI;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.UriBuilder;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;

public class Test {
    public static void main(String[] args) {
        ClientConfig config = new DefaultClientConfig();
        Client client = Client.create(config);
        WebResource service = client.resource(getBaseURI());
        System.out.println(service.path("resources").path("hello").path("xml").accept(
                        MediaType.TEXT_PLAIN).get(ClientResponse.class));
    }
    private static URI getBaseURI() {
            return UriBuilder.fromUri("http://localhost/WebServicePgm1").build();
    }
}

尝试在客户端代码中测试的方法是

    @GET
    @Path("xml")
    @Produces(MediaType.TEXT_XML)
    public String sayXMLHello() {
        return "<?xml version=\"1.0\"?>" + "<hello> Hello Jersey </hello>";
    }

更改jar文件之后

解决了上述问题,并出现了新问题。

@ gkatkov正在使用Apache Tomcat 6.0.20及更高版本。
我已经将球衣罐更新为球衣1.8。更新jar文件后,出现另一个错误

我现在放的jar文件是

jersey-server-1.8.jar
jersey-json-1.8.jar
jersey-core-1.8.jar
jersey-client-1.8.jar

现在的问题是

com.sun.jersey.spi.inject.Errors processErrorMessages
SEVERE: The following errors and warnings have been detected with resource and/or provider classes:
  SEVERE: Missing dependency for field: javax.ws.rs.core.UriInfo com.sun.jersey.impl.template.ViewableMessageBodyWriter.ui
  SEVERE: Missing dependency for field: com.sun.jersey.spi.template.TemplateContext com.sun.jersey.impl.template.ViewableMessageBodyWriter.tc
Exception in thread "main" com.sun.jersey.spi.inject.Errors$ErrorMessagesException
        at com.sun.jersey.spi.inject.Errors.processErrorMessages(Errors.java:170)
        at com.sun.jersey.spi.inject.Errors.postProcess(Errors.java:136)
        at com.sun.jersey.spi.inject.Errors.processWithErrors(Errors.java:199)
        at com.sun.jersey.api.client.Client.<init>(Client.java:187)
        at com.sun.jersey.api.client.Client.<init>(Client.java:170)
        at com.sun.jersey.api.client.Client.create(Client.java:679)
        at pack1.client.Test.main(Test.java:20)

我还需要放置其他jar文件吗?

参考方案

我遇到了同样的问题。我发现分别使用jersey-bundle-1.8.jar而不是客户端库和服务器库可以解决此问题。你可以试试。

REST API版本控制 - java

我目前在基于Java的Web应用程序上工作。最近,我们使用Spring创建了一些REST端点。这样做的原因是因为我们开发了一种混合移动应用程序,该应用程序通过这些端点与我们的主应用程序集成。问题是,今后我们还不确定如何处理更新。如果我们更新API,例如我们更改端点方法的方法签名,或者更改作为JSON返回的DTO上的属性,那么如果我们的移动用户运行的是过时版本…

Java:正则表达式模式匹配器是否有大小限制? - java

我的模式类似于OR:“word1 | word2 | word3”我大约有800个字。可能有问题吗? 参考方案 您仅受记忆和理智的限制。 :)

泽西岛2日志记录和gzip - java

我已经为ResourceConfig注册了LogginFilter过滤器。// Enable logging of requests registerInstances(new LoggingFilter(java.util.logging.Logger.getLogger(this.getClass().getName()), true)); 我还启用了G…

Java:线程池如何将线程映射到可运行对象 - java

试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执行的可运行“任务”之间的关系。如果我创建一个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务无关的“工人无人机”可用于执行任何任务?无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考方案 …

JAVA:字节码和二进制有什么区别? - java

java字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…