繁体   English   中英

Spring Rest WebService返回布尔值

[英]spring rest webservice return boolean value

我有一个简单的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确实设置为true或false

我的客户如下

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>

根据HTTP标准, 状态406(不可接受)表示

由请求标识的资源仅能够生成响应实体,该响应实体具有根据请求中发送的接受标头不可接受的内容特征。

您的控制器方法说

 @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转换。

您的客户端需要发送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");
...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM