2013-08-03 69 views
0

我在使用CXF webclient时遇到以下错误(406),但是当我使用URL API时,我得到了预期的输出。cxf webclient - 异常[请求处理失败;嵌套的异常是状态:406

INFO: Reloading Context with name [/assignment] is completed 
http://localhost:8080/assignment/cxf/login/test/test1 
Result--><?xml version="1.0" encoding="UTF-8" standalone="yes"?><user> <userName>test</userName> <firstName>Mike</firstName> <lastName>Tom</lastName></user> 
Aug 02, 2013 11:20:31 PM org.apache.cxf.jaxrs.utils.JAXRSUtils findTargetMethod 
WARNING: No operation matching request path "/assignment/cxf/login/test/test1" is found, Relative Path: /login/test/test1, HTTP Method: GET, ContentType: */*, Accept: application/xml,. Please enable FINE/TRACE log level for more details. 
Aug 02, 2013 11:20:31 PM org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper toResponse 
WARNING: WebApplicationException has been caught : no cause is available 
Aug 02, 2013 11:20:31 PM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet [dispatcher] in context with path [/assignment] threw exception [Request processing failed; nested exception is Status : 406 
Headers : 
Date : Sat, 03 Aug 2013 04:20:31 GMT 
Content-Length : 0 
Server : Apache-Coyote/1.1 
] with root cause 
Status : 406 
Headers : 
Date : Sat, 03 Aug 2013 04:20:31 GMT 
Content-Length : 0 
Server : Apache-Coyote/1.1 

    at org.apache.cxf.jaxrs.client.WebClient.doInvoke(WebClient.java:680) 
    at org.apache.cxf.jaxrs.client.WebClient.invoke(WebClient.java:324) 
    at org.apache.cxf.jaxrs.client.WebClient.get(WebClient.java:421) 
    at com.viasat.test.login.servlet.LoginServlet.processLogin(LoginServlet.java:45) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 

我的客户端代码:

 URL url = new URL("http://localhost:8080/assignment/cxf/login/"+name+"/"+password); 
     HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
     conn.setRequestMethod("GET"); 
     conn.setRequestProperty("Accept", "application/json"); 
     BufferedReader br = new BufferedReader(new InputStreamReader(
      (conn.getInputStream()))); 
     StringBuilder res = new StringBuilder(); 
     String output; 
     while ((output = br.readLine()) != null) { 
      res.append(output); 
     } 
     System.out.println("Result-->"+res.toString()); 
     WebClient webClient = WebClient.create("http://localhost:8080/assignment/cxf/login/"+name+"/"+password);    
    // WebClient t = webClient.path(""); 
     String res = webClient.accept("text/xml").get(String.class); 
     System.out.println("=============="+res); 

REST端点服务类:

@GET 
    @Path("/login/{userName}/{password}") 
    @Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_XML }) 
    public String userLogin(@PathParam("userName")String username, @PathParam("password")String password) 
      throws JAXBException, PropertyException, FileNotFoundException { 

问题

1)什么改变,我需要做,修复错误

2)作为Json返回,我需要做什么更改?如果我写,conn.setRequestProperty(“Accept”,“application/xml”);我得到错误。

回答

1

实测溶液:

客户端更改:

WebClient webClient = WebClient.create("http://localhost:8080/assignment/cxf/login/test/test1");    
String res = webClient.accept("application/xml").get(String.class); 

这里代替String res = webClient.accept("text/xml").get(String.class);制成

String res = webClient.accept("application/xml").get(String.class); 

服务类的变化:

@GET 
    @Path("/login/{userName}/{password}") 
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) 
    @Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) 
    public String userLogin(@PathParam("userName")String username, @PathParam("password")String password) 

在userLogin方法中改为MediaType.APPLICATION_XML而不是MediaType.TEXT_XML

0

根据HTTP规范,406响应意味着服务器不能满足请求的ACCEPT标头中所述的要求。但是,服务器端日志消息似乎暗示其他事情正在发生。

我建议你做什么日志消息建议。启用调试日志记录并查看细粒度的日志消息对发生什么问题的说明。

相关问题