Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SpringRESTWebService返回布尔值_Java_Rest_Spring Mvc - Fatal编程技术网

Java SpringRESTWebService返回布尔值

Java SpringRESTWebService返回布尔值,java,rest,spring-mvc,Java,Rest,Spring Mvc,我有一个简单的Web服务,它检查用户名是否存在并返回一个布尔值 @RequestMapping(method=RequestMethod.GET, value="/isUsernameTaken/{username}", headers={"Accept=application/xml"}) public @ResponseBody Boolean isUsernameTaken(@PathVariable String username) throws FinderException {

我有一个简单的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);
}
    <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>
publicstaticvoidmain(字符串[]args){
ApplicationContext ctx=新的类路径XMLApplicationContext(“类路径: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=新字符串(base64CredsBytes);
HttpHeaders=新的HttpHeaders();
标题。添加(“授权”、“基本”+base64Creds);
setAccept(Arrays.asList(MediaType.APPLICATION_XML));
HttpEntity请求=新的HttpEntity(标头);
ResponseEntity response=restTemplate.exchange(“http://localhost:8031/WebService/service/isUsernameTaken/admin,HttpMethod.GET,请求,Boolean.class);
Boolean msg=response.getBody();
系统输出打印(msg);
}
我得到一个406不可接受的例外

我的spring配置如下所示

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);
}
    <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>

com.merc.domain.User

根据HTTP标准,是指

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

你的控制器方法是

 @RequestMapping(method=RequestMethod.GET, value="/isUsernameTaken/{username}", headers={"Accept=application/xml"})
因此,您的控制器将只服务于请求
Accept=application/xml
的请求。对资源的所有其他表示形式的请求将导致406响应状态

我的结论是,您的客户机请求(
GET
)并不是要求
application/xml



您的客户要求从
RestTemplate
获得
响应属性。因此,发送到服务器的
Accept
标题将列出客户端所有可转换
布尔值的消息转换器的媒体类型。您唯一的消息转换器是
jaxbMarshaller
。我不熟悉该转换器,但我猜您没有正确配置其SpringBean,因此它将从
布尔值转换为
您的客户端需要发送
应用程序/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");
...

关于如何修复的任何想法您的错误在您的客户机上,或者您如何使用您的客户机。我已经提供了客户机代码,如果不是太麻烦的话,您能告诉我我犯了什么错误吗?我已经更新了客户机以包括setAccept,但仍然得到完全相同的结果。请帮忙