¿Por qué no funciona este simple ejemplo de clasificación JSON en Apache Camel?

He pasado bastante tiempo tratando de resolver esto. Estoy trabajando en la escritura de un servicio que recibe un nombre de usuario y una contraseña. Luego utiliza un procesador para generar un token de autenticación que se devuelve en la parte de salida del mensaje. Quiero aceptar parámetros con formato JSON y estoy intentando que la conversión de tipos funcione correctamente. He reducido el problema a una prueba de unidad independiente que se encuentra a continuación:

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

}

}

Cuando ejecuto esta prueba, obtengo esta excepción en la consola:

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>

¿Me estoy acercando a esto mal de alguna manera? ¡Por favor ayuda!

preguntado el 22 de mayo de 12 a las 21:05

1 Respuestas

Encontré una manera de hacer que esto funcione. Cambié a Jackson como mi analizador JSON y funcionó. Para hacer esto, todo lo que tuve que hacer fue cambiar el RouteBuilder a esto:

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

También tuve que cambiar el formato del JSON que se envía por cable desde esto:

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

a esto (que me gusta más de todos modos):

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

contestado el 22 de mayo de 12 a las 21:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.