2014-01-22 20 views
2

我有一个简单的Web服务是检查,如果用户名存在,且使用调试器返回boolean弹簧安置web服务返回布尔值

@RequestMapping(method=RequestMethod.GET, value="/isUsernameTaken/{username}", headers={"Accept=application/xml"}) 
public @ResponseBody Boolean isUsernameTaken(@PathVariable String username) throws FinderException { 
    boolean isUsernameTaken = userManager.isUsernameTaken(username); 
    return isUsernameTaken; 
} 

,我isUsername不会获取设置为根据输入真或假

我的客户看起来如下

public static void main(String[] args) { 
    ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:spring/ws/rest-servlet.xml"); 
    RestTemplate restTemplate = ctx.getBean("restTemplate", RestTemplate.class); 

    String plainCreds = "rest:123456"; 
    byte[] plainCredsBytes = plainCreds.getBytes(); 
    byte[] base64CredsBytes = Base64.encodeBase64(plainCredsBytes); 
    String base64Creds = new String(base64CredsBytes); 

    HttpHeaders headers = new HttpHeaders(); 
    headers.add("Authorization", "Basic " + base64Creds); 
    headers.setAccept(Arrays.asList(MediaType.APPLICATION_XML)); 

    HttpEntity<String> request = new HttpEntity<>(headers); 
    ResponseEntity<Boolean> response = restTemplate.exchange("http://localhost:8031/WebService/service/isUsernameTaken/admin", HttpMethod.GET, request, Boolean.class); 
    Boolean msg = response.getBody(); 


    System.out.print(msg); 
} 

,我收到了406不可接受的例外

我的弹簧配置看起来如下

<context:component-scan base-package="com.merc.ws.service" /> 

<import resource="../business-config.xml" /> 

<mvc:annotation-driven /> 

<!-- To enable @RequestMapping process on type level and method level --> 
<!-- Convert Input --> 
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" /> 
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" > 
    <property name="messageConverters"> 
     <list> 
      <ref bean="marshallingConverter" /> 
     </list> 
    </property> 
</bean> 

<bean id="marshallingConverter" class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter"> 
    <property name="marshaller" ref="jaxbMarshaller" />  
    <property name="unmarshaller" ref="jaxbMarshaller" /> 
</bean> 

<bean id="jaxbMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller"> 
    <property name="classesToBeBound"> 
     <list> 
      <value>com.merc.domain.User</value> 
     </list> 
    </property> 
</bean> 

<bean id="restTemplate" class="org.springframework.web.client.RestTemplate"> 
    <property name="messageConverters"> 
     <list>  
      <ref bean="marshallingConverter"/> 
     </list> 
    </property> 
</bean> 

回答

1

根据HTTP标准,status 406 (Not Acceptable)意味着

该请求所标识的资源只能能够产生具有根据内容无法接收响应实体的在请求中发送接受标头。

你的控制器的方法说

@RequestMapping(method=RequestMethod.GET, value="/isUsernameTaken/{username}", headers={"Accept=application/xml"}) 

所以您的控制器将成为只要求Accept=application/xml请求。对资源的所有其他表示的请求将导致406响应状态。

我断定您的客户请求(GET)没有要求application/xml


您的客户端请求从RestTemplate一个ResponseEntity<Boolean>。因此,发送到服务器的Accept标题将列出可以转换Boolean的客户端的所有消息转换器的媒体类型。您唯一的信息转换器是jaxbMarshaller。我不熟悉那个转换器,但我想你没有正确地配置它的Spring bean,所以它会从Boolean转换。

+1

关于如何解决它 – user373201

+0

你的错是你的客户,或者你如何使用您的客户端的任何想法。 – Raedwald

+1

我已经提供了客户端代码,如果不是太麻烦你能告诉我我犯了什么错误 – user373201

0

你的客户端需要发送application/xml接受头:

... 
HttpHeaders headers = new HttpHeaders(); 
headers.add("Authorization", "Basic " + base64Creds); 
headers.setAccept(Arrays.asList(MediaType.APPLICATION_XML)); 
// done manually that'd be 
// headers.add("Accept", "application/xml"); 
... 
+1

我已经更新了客户端以包含setAccept,但仍然得到完全相同的结果。请帮忙 – user373201