获取net.sf.json.jsonexception:java.lang.reflect.invocationtargetexception

6ojccjat  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(372)

我有以下方法

public static <E> APIGatewayProxyResponseEvent generateResponse(E request, E response, int statusCode){

        JSONObject result = new JSONObject();
        result.put(Constants.REQUEST, request);
        result.put(Constants.RESPONSE, response);

        return new APIGatewayProxyResponseEvent()
                .withBody(result.toString())
                .withStatusCode(statusCode)
                .withHeaders(Constants.commonHeaders);
    }

我要走了 net.sf.json.JSONException: java.lang.reflect.InvocationTargetException 什么时候 result.put(Constants.RESPONSE, response); 已执行
回应是

相应的类别为:

public class PhysicalMediaURL extends MediaURL {
        private static final String IDENTIFIER_PREFIX = "images/I/";

        public PhysicalMediaURL(String physicalId, String extension, MediaHostnameProvider mediaHostnameProvider) {
            super("images/I/" + physicalId, extension, mediaHostnameProvider);
        }
    }

public abstract class MediaURL implements URL {
    private final String identifier;
    private final String extension;
    private final MediaHostnameProvider mediaHostnameProvider;

    public MediaURL(String identifier, String extension, MediaHostnameProvider mediaHostnameProvider) {
        this.identifier = identifier;
        this.extension = extension;
        this.mediaHostnameProvider = mediaHostnameProvider;
    }

    public String getIdentifier() {
        return this.identifier;
    }

    public String getExtension() {
        return this.extension;
    }

    public String getDomainName() {
        return this.mediaHostnameProvider.getMediaHostname(this.getExtension());
    }

    public String getURL() {
        StringBuilder urlBuilder = new StringBuilder();
        urlBuilder.append("https://");
        urlBuilder.append(this.getDomainName());
        urlBuilder.append('/');
        urlBuilder.append(this.getIdentifier());
        urlBuilder.append('.');
        urlBuilder.append(this.getExtension());
        return urlBuilder.toString();
    }

    public List<String> getStyleTags() {
        return null;
    }
}

其中physicalmediaurl的类型为:url,这是一个接口

public interface URL {
    String getIdentifier();

    String getDomainName();

    String getExtension();

    List<String> getStyleTags();

    String getURL();
}

我有点被困在这个。。我需要帮助。

lsmepo6l

lsmepo6l1#

首先,看起来您使用的json实现不像其他实现那样定期更新(您的异常来自net.sf.json)。我总是建议使用org.json实现,因为它会定期收到更新和错误修复。
在这种形式中使用jsonobject的大多数实现都使用基于bean的反射从对象中检索值。当您的对象位于继承层次结构中时,这并不总是您想要的,因为根据对象和jsonobject impl,它将从实现中提取不在更高级别类型(本例中为url)上的字段。
如果您真的想要一个泛型序列化函数,请使用类似jackson或gson的东西,它将允许您指定类型作为序列化的一部分。否则,请考虑在将对象传递给generateresponse函数之前,将其转换为更简单的对象,例如可以明确序列化的map<string,string>。
最后一点,jsonobject的泛型序列化是可行的,但是,它的性能可能比使用像jackson这样的专用高级序列化程序要差。它最好与显式put方法一起使用以生成简单对象。

相关问题