0

我正在构建一个 Angular 应用程序,该应用程序与使用 Spring 框架编写的 restful API 进行通信。

我的类层次结构是这样的:

class Resource
class FileResource extends Resource
class DbResource extends Resource
class DbFileResource extends DbResource
class DbServerResource extends DbResource

例如,我在我的发布请求中发送了这样一个 json 对象,它适合我的类层次结构中的 DbServerResource:

{
"resourceName": "Res2",
"resourceType": "DB_SERVER",
"dbms": "DB2",
"dbName": "SHOP",
"host": "<some ip>",
"port": 50000,
"userName": "user",
"password": "password"
}

在我的控制器中,我有一个我有的addResource方法:

@RequestMapping (method = RequestMethod.POST, value="/resource")
private void addResource(@RequestBody Resource resource)

我有一个工厂类,我正在调用它来检索要使用的确切对象,方法是instanceof

public ResourceId getResourceId(Resource res){

    if (res== null){
        return null;
    }....

但是在发送我的请求时,我收到了 NullPointerException:

java.lang.NullPointerException com...ResourceManager.validateResourceId(ResourceManager.java:861) com...management.resource.manager.ResourceManager.addResource(ResourceManager.java:127)

似乎工厂无法识别相关对象并返回 null!spring 如何识别它应该将 json 映射到哪个对象?!还是我做错了什么!

4

1 回答 1

0

我尝试使用这些注释: https ://fasterxml.github.io/jackson-annotations/javadoc/2.4/com/fasterxml/jackson/annotation/JsonTypeInfo.html

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, 
            include = JsonTypeInfo.As.PROPERTY, 
            property = "resourcetype",
            visible=true)
@JsonSubTypes({
@JsonSubTypes.Type(value = DbServerResource.class, name = "dbServerResource"),
@JsonSubTypes.Type(value = DbFileResource.class, name = "dbFileResource"),
@JsonSubTypes.Type(value = FileResource.class, name = "fileResource")
})

public abstract class DisplayResource{
protected String resourceName;
@JsonProperty(value = "resourceType") protected Types resourceType;

public enum Types { DB_SERVER, DB_FILE, FILE }  

但是现在当我发送我的 POST 请求时,我收到了状态 400 错误请求!!!

我的控制器端现在看起来像这样:

@RequestMapping (method = RequestMethod.POST, value="/resource")
private @ResponseBody <T extends DisplayResource>T addResource(@RequestBody T resource) 
        throws ResourceManagementException, ConfigurationException, MalformedURLException{

    logger.info("Adding a new resource: " + resource.toString());

    ...     
    resourceManagerService.addResource("admin", resourceFactory.getResourceId(resource), credentials);

    return resource;
}

GET 方法仍然可以正常工作。

于 2017-11-12T09:19:42.233 回答