5

我正在尝试通过代理调用 Web 服务方法,但我收到一条错误消息:“目标类的子资源没有 jax-rs 注释。:org.jboss.resteasy.core.ServerResponse”

这是我的服务器类

@Path("/authorizationCheck")
public class AuthorizationRestService implements AuthorizationService  {

  @Override
    @Path("/webserviceTest")
    public Response webserviceTest(){
    TestDTO  x = new TestDTO();
    x.setFieldOne("ffff");
    x.setFieldTwo("gggg");
    Response res = Response.ok(x).build();
    return res;


    }
}

有这样的界面

@Path("/authorizationCheck")
public interface AuthorizationService {

    @POST
    @Path("/webserviceTest")
    public Response webserviceTest();
}

我的返回对象包含在响应中

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class TestDTO {

    private String fieldOne;

    private String fieldTwo;

    public String getFieldOne() {
        return fieldOne;
    }

    public void setFieldOne(String fieldOne) {
        this.fieldOne = fieldOne;
    }

    public String getFieldTwo() {
        return fieldTwo;
    }

    public void setFieldTwo(String fieldTwo) {
        this.fieldTwo = fieldTwo;
    }



}

最后是我的客户班

@Stateful
@Scope(ScopeType.CONVERSATION)
@Name("authorizationCheckService")
public class AuthorizationCheckService {

    public void testWebservice(){
        RegisterBuiltin.register(ResteasyProviderFactory.getInstance());
        AuthorizationService  proxy = 
                ProxyFactory.create(AuthorizationService.class,
                        ApplicationConfig.WORKFLOWSERVER_URL + "services/authorizationCheck/webserviceTest");
        Response response =   proxy.webserviceTest();
        return;



    }
}

我在这里做错了什么,任何帮助将不胜感激。

4

3 回答 3

4

您有两个带有 webserviceTest() 的注释,它们是 @POST 和 @Path。

在实现的类中重复覆盖方法中的两个注释。这意味着将 @POST 注释添加到 webserviceTest() 方法。

它应该工作!

这就是为什么它不起作用的原因..在实现类时没有适当的注释。 为什么java类不从实现的接口继承注解?

于 2013-09-25T14:53:23.130 回答
2

您可以删除实现类和具体方法上的 @Path 注释,并且只注释您的接口,如下所示:

public class AuthorizationRestService implements AuthorizationService  {

    @Override
    public Response webserviceTest(){
        TestDTO  x = new TestDTO();
        x.setFieldOne("ffff");
        x.setFieldTwo("gggg");
        Response res = Response.ok(x).build();
        return res;
    }
}

注意:不要忘记在您的接口方法上使用 @Produces 来定义您的 MIME 类型,例如 MediaType.APPLICATION_XML

@Path("/authorizationCheck")
public interface AuthorizationService {

    @POST
    @Path("/webserviceTest")
    @Produces(MediaType.APPLICATION_XML)
    public Response webserviceTest();
}

在此处查看示例:http: //pic.dhe.ibm.com/infocenter/initiate/v9r5/index.jsp?topic= %2Fcom.ibm.composer.doc%2Ftopics%2Fr_composer_extending_services_creating_rest_service_rest_interface.html

在这里:http ://pic.dhe.ibm.com/infocenter/initiate/v9r5/index.jsp?topic=%2Fcom.ibm.composer.doc%2Ftopics%2Fr_composer_extending_services_creating_rest_service_rest_interface.html

于 2013-10-02T22:02:48.437 回答
0

我变成了这样

@Path("/authorizationCheck")
public class AuthorizationRestService implements AuthorizationService  {

@Override
@Path("/webserviceTest")
@POST
@Produces(MediaType.APPLICATION_XML)
public Response webserviceTest(){
TestDTO  x = new TestDTO();
x.setFieldOne("ffff");
x.setFieldTwo("gggg");
Response res = Response.ok(x).build();
return res;


}
}

我的测试客户端不同

public class CustomerResourceTest
{
@Test
public void testCustomerResource() throws Exception
{
   URL postUrl = new URL("http://localhost:9095/authorizationCheck/webserviceTest");
   HttpURLConnection   connection = (HttpURLConnection) postUrl.openConnection();
      connection.setRequestMethod("POST");
      System.out.println("Content-Type: " + connection.getContentType());

      BufferedReader reader = new BufferedReader(new
              InputStreamReader(connection.getInputStream()));

      String line = reader.readLine();
      while (line != null)
      {
         System.out.println(line);
         line = reader.readLine();
      }
      Assert.assertEquals(HttpURLConnection.HTTP_OK, connection.getResponseCode());
      connection.disconnect();

   return;
}
}

它产生了输出

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><testDTO><fieldOne>ffff</fieldOne><fieldTwo>gggg</fieldTwo></testDTO>

还必须添加以下依赖项

<dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.2.11</version>
    </dependency>
    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-jaxb-provider</artifactId>
        <version>2.2.0.GA</version>
    </dependency>

试过你的代码。

public void testCustomerResource() throws Exception
{
   RegisterBuiltin.register(ResteasyProviderFactory.getInstance());
   AuthorizationService  proxy = 
           ProxyFactory.create(AuthorizationService.class,"http://localhost:9095/");
   ClientResponse response = (ClientResponse) proxy.webserviceTest();
   String str = (String)response.getEntity(String.class);
   System.out.println(str);
   return;
}

产生相同的输出

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><testDTO><fieldOne>ffff</fieldOne><fieldTwo>gggg</fieldTwo></testDTO>

请注意我是如何创建代理的。我只有基本 url **http://localhost:9095/**。我没有在其中提到资源授权检查/webserviceTest。这与您的编码方式不同。

于 2013-09-29T14:42:28.193 回答