为什么Apache Camel中这个简单的JSON编组示例不起作用?

Spi*_*ina 4 java xstream apache-camel unmarshalling

我花了很长时间试图解决这个问题.我正在编写一个接收用户名和密码的服务.然后,它使用处理器生成一个身份验证令牌,该令牌在消息的Out部分中返回.我想接受JSON格式的参数,并尝试让类型转换正常工作.我把问题简化为一个独立的单元测试,如下所示:

import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.model.dataformat.JsonDataFormat;
import org.apache.camel.model.dataformat.JsonLibrary;
import org.apache.camel.test.junit4.CamelTestSupport;
import org.junit.Test;
import com.thoughtworks.xstream.annotations.XStreamAlias;


public class BasicJsonMarshallingTest extends CamelTestSupport {

@Override
protected RouteBuilder createRouteBuilder() throws Exception {
    final Processor simpleProcessor = new Processor() {
        @Override public void process(Exchange exchange) throws Exception {
            SimpleBean bean = exchange.getIn().getBody(SimpleBean.class);
            if(bean == null){
                return;
            }
            exchange.getOut().setBody("a=" + bean.getA() + " b=" + bean.getB());
        }
    };

    return new RouteBuilder() {
        @Override public void configure() throws Exception {
            JsonDataFormat jsonFormat = new JsonDataFormat(JsonLibrary.XStream);
            jsonFormat.setUnmarshalType(SimpleBean.class);
            from("direct:service").unmarshal(jsonFormat).process(simpleProcessor);
        }
    };
}

@Test
public void testSuccessfulAuthentication(){
    Exchange lAuthRequest = createExchangeWithBody("{\"simple\":{\"a\":\"v1\",\"b\":\"v2\"}}");
    template.send("direct:service", lAuthRequest);
    assertEquals("a=v1 b=v2", lAuthRequest.getOut().getBody());
}

@XStreamAlias("simple")
public static final class SimpleBean {

    private String a;
    private String b;

    public void setA(String a) {
        this.a = a;
    }
    public String getA() {
        return a;
    }
    public void setB(String b) {
        this.b = b;
    }
    public String getB() {
        return b;
    }

}

}
Run Code Online (Sandbox Code Playgroud)

当我运行此测试时,我在控制台中得到此异常:

com.thoughtworks.xstream.mapper.CannotResolveClassException: simple
    at com.thoughtworks.xstream.mapper.DefaultMapper.realClass(DefaultMapper.java:56)[xstream-1.4.1.jar:]
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)[xstream-1.4.1.jar:]
    <snip>
Run Code Online (Sandbox Code Playgroud)

我是否以某种方式接近这个错误?请帮忙!

Spi*_*ina 8

我找到了一种方法来完成这项工作.我切换到杰克逊作为我的JSON解析器,它工作.要做到这一点,我所要做的就是将RouteBuilder更改为:

    return new RouteBuilder() {
        @Override public void configure() throws Exception {
            from("direct:service").unmarshal().json(JsonLibrary.Jackson, SimpleBean.class).process(simpleProcessor);
        }
    };
Run Code Online (Sandbox Code Playgroud)

我还必须通过以下方式更改通过线路发送的JSON的格式:

{ "简单":{ "一个": "V1", "B": "V2"}}

对此(我更喜欢):

{"a":"v1","b":"v2"}