2

私は安らかな WS を開発しています。ユーザーが WS からデータを XML または Json の形式で取得できるようにし、Jsonp が必要な場合はコールバック関数を選択できるようにしたいと考えています。これは私が今まで持っていたもので、インターセプターの部分はCXF-JAX-RS: Data Bindingsに基づいています。

私の休息サービス:

@GET
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({ "application/x-javascript", MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public Response getServers(@Context ServletContext context,
        @Context Request request,
        @QueryParam("format") String format,
        @QueryParam("callback") String callback) {

some code where server object is created....

    if(format.equals("json"){

        if(callback!= null){
            response = Response.status(Status.OK).type("application/x-javascript")
                        .entity(server).build();
        }else{
            response = Response.status(Status.OK).type("application/json")
                        .entity(server).build();
        }

    } else {
    response = Response.status(Status.OK).type("application/xml")
                        .entity(server).build();
    }
    return response;
}

私のサーバー オブジェクト:

@XmlRootElement (name="Server")
public class Server implements Serializable {

    private String name=null;
    private String hardware = null;

    public Server(){

    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getHardware() {
        return hardware;
    }

    public void setHardware(String hardware) {
        this.hardware = hardware;
    }

}

WEB-INF の私の beans.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:jaxrs="http://cxf.apache.org/jaxrs"
  xmlns:context="http://www.springframework.org/schema/context"
  xsi:schemaLocation="
http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://cxf.apache.org/jaxrs
http://cxf.apache.org/schemas/jaxrs.xsd">

  <import resource="classpath:META-INF/cxf/cxf.xml" />

  <context:property-placeholder/>
  <context:annotation-config/>
  <bean class="org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer"/>
  <bean class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer"/>

   <jaxrs:server id="services" address="/">
    <jaxrs:serviceBeans>
      <bean class="com.ba.serversws_cxf.resources.MyResource" />
    </jaxrs:serviceBeans>

    <jaxrs:inInterceptors>
       <bean class="org.apache.cxf.jaxrs.provider.jsonp.JsonpInInterceptor">
        <property name="callbackParam" value="callback"/>
       </bean>
    </jaxrs:inInterceptors>
    <jaxrs:outInterceptors>
       <bean class="org.apache.cxf.jaxrs.provider.jsonp.JsonpPreStreamInterceptor">
            <property name="mediaType" value="application/x+javascript"/>
       </bean>
       <bean class="org.apache.cxf.jaxrs.provider.jsonp.JsonpPostStreamInterceptor"/>
    </jaxrs:outInterceptors>

    <jaxrs:providers>
        <bean class="org.codehaus.jackson.jaxrs.JacksonJsonProvider"/>
    </jaxrs:providers>
    </jaxrs:server>

</beans>

クエリ パラメータ「callback」を設定すると発生するエラーは次のとおりです。

org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor writeResponseErrorMessage
WARNING: No message body writer has been found for response class Server.

他の 2 つのケースでは問題なく動作します。

解決策を見つけるために検索しましたが、まだ何もありません。

何か案は?

ありがとう

4

1 に答える 1

0

これが私のクラスです@OverrideswrtieTo()org.apache.cxf.jaxrs.provider.json.JSONProvider;

まず、beans.xml ファイルで を使用し、拡張<jaxrs:extensionMappings>を宣言しましたjsonp

ここにコードがあります

<jaxrs:server id="services" address="/">
   <jaxrs:extensionMappings>
      <entry key="xml" value="application/xml" />
      <entry key="json" value="application/json" />
      <entry key="jsonp" value="application/javascript"/>
   </jaxrs:extensionMappings>
</jaxrs:server>

writeTo()以下は、私が持っているメソッドの私のコードです@Override

import java.io.IOException;
import java.io.OutputStream;

import java.lang.annotation.Annotation;
import java.lang.reflect.Type;

import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;

import org.apache.cxf.jaxrs.provider.json.JSONProvider;
import org.apache.cxf.jaxrs.utils.HttpUtils;

@SuppressWarnings("rawtypes")
@Produces("application/javascript")
public class JsonpProvider extends JSONProvider {


    @SuppressWarnings("unchecked")
    @Override
    public void writeTo(Object obj, Class cls, Type genericType,
            Annotation[] anns, MediaType m, MultivaluedMap headers,
            OutputStream os) throws IOException {

        String requestURI = getContext().getHttpServletRequest()
                .getRequestURI();
        if (requestURI.contains(".jsonp")) {
            String prefix = getContext().getHttpServletRequest().getParameter(
                    "_jsonp");
            if (prefix != null && !prefix.isEmpty()) {
                os.write(prefix.getBytes(HttpUtils.getSetEncoding(m, headers,
                        "UTF-8")));
            } else {
                os.write("callback".getBytes(HttpUtils.getSetEncoding(m,
                        headers, "UTF-8")));
            }
            os.write('(');
            super.writeTo(obj, cls, genericType, anns, m, headers, os);
            os.write(')');
        } else {
            super.writeTo(obj, cls, genericType, anns, m, headers, os);
        }
    }
}

上記のコードで行っていることは.jsonp、URL に拡張子が付与されているかどうかを確認することです。はいの場合、コールバック関数で jsopn を返さなければならないことがわかります。最後に、コールバック関数の名前を設定します。ユーザーが_jsonpクエリ パラメータを URL に設定した場合、このパラメータの値はコールバック関数の名前になります。_jsonppquery パラメータが nullの場合、デフォルトの name を入力しますcallback

もちろん、プロバイダーbeans.xmlとしてのファイルではjson、上記の JsonpProvider を配置します。

<jaxrs:providers>
   <bean class="org.apache.cxf.jaxrs.ext.search.SearchContextProvider"/>
   <bean class="com.ba.serversws_cxf.utils.JsonpProvider">
      <property name="ignoreNamespaces" value="true" />
      <property name="dropRootElement" value="false" />
      <property name="supportUnwrapped" value="true" />
   </bean>
</jaxrs:providers>

それが@bhuvanに役立つことを願っています!

于 2013-06-28T13:30:42.250 に答える