1

我正在使用Neba 库Apache sling

现在我的弹簧控制器可以正常使用此代码。

@RestController
public class CategoryController {
    @RequestMapping(value = "/category/list", method = RequestMethod.GET)
    public String sayHello() {
        return "Hello World!";
    }
}

点击 url http://localhost:8080/bin/mvc.do/category/list 后

我得到回应“ Hello World!

但是当我试图像这样返回列表字符串时 -

@RestController
public class CategoryController {
    @RequestMapping(value = "/category/list", method = RequestMethod.GET)
    public List<String> sayHello() {
        return new Arrays.asList(new String[]{"A","B","C"});
    }
}

我收到以下异常 -

java.lang.IllegalArgumentException: No converter found for return value of type: class java.util.Arrays$ArrayList

我的图书馆里确实有杰克逊数据绑定

<dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.8.5</version>
        </dependency>

我还检查了 bundle jar 它在 lib 中有这些库。仍然不确定为什么它不起作用。任何帮助都是高度赞赏的。

4

2 回答 2

1

要启用 Spring 对来自控制器响应的 JSON 转换的支持,请部署 jackson-databind、jackson-core、jackson-annotations 包。然后 Spring 拾取这些包(这可能需要刷新/重新启动 Sling)并自动添加新的消息转换器,这些转换器使用 jackson 将 @Controller 的方法返回的对象转换为 JSON,例如:

@RestController
public class CategoryController {
    @RequestMapping(value = "/category/list", method = RequestMethod.GET)
    public List<String> sayHello() {
        return Arrays.asList("A","B","C");
    }
}

注意:实际上必须部署这些杰克逊捆绑包。仅靠 jackson 包的可用性是不够的,因为 NEBA 附带的 Spring 捆绑包对 jackson 具有可选的 require-bundle(不是 import-package)依赖项(请参阅neba-155了解原因)。

NEBA示例项目现在包含了 jackson 包,因此您可以将其作为起点来尝试从控制器响应中进行自动 JSON 转换。

关于上面蒂姆的评论,不必手动转换。Spring MVC 可以通过请求的“Accept”标头和可用的 Spring 消息转换器基于内容协商自动执行此操作,请参阅Spring Docs 中的$ 28.10.2 HTTP 消息转换

希望有帮助!

于 2016-12-08T12:54:10.633 回答
0

如果你想用 RestController 和 Jackson 返回 JSON,你必须像这样使用ObjectMapper

@RestController
public class CategoryController {
    //Add produces application/json
    @RequestMapping(value = "/category/list", method = RequestMethod.GET, produces = "application/json")
    public List<String> sayHello() {
        ObjectMapper mapper = new ObjectMapper();
        //Object to JSON in String
        String jsonInString = mapper.writeValueAsString(new Arrays.asList(new String[]{"A","B","C"}));
        return jsonInString;
    }
}
于 2016-12-06T08:37:57.307 回答