我正在尝试从另一个类中的类中提取数据并使用数据填充JPanel,但由于某种原因它无法正常工作。
这是完整的restConnector类,我在其中提取JSON数据。 据我所知,这很好用。
public class restConnector {
private static final Logger LOGGER = LoggerFactory.getLogger(restConnector.class);
private static final restConnector INSTANCE = new restConnector();
public static restConnector getInstance() {
return restConnector.INSTANCE;
}
private restConnector(){
}
private static String user = "ss";
private static String pwd = "ee
public static String encode(String user, String pwd) {
final String credentials = user+":"+pwd;
BASE64Encoder encoder = new sun.misc.BASE64Encoder();
return encoder.encode(credentials.getBytes());
}
//Open REST connection
public static void init() {
restConnector.LOGGER.info("Starting REST connection...");
try {
Client client = Client.create();
client.addFilter(new LoggingFilter(System.out));
WebResource webResource = client.resource("https://somewebpage.com/
String url = "activepersonal";
ClientResponse response = webResource
.path("api/alerts/")
.queryParam("filter", ""+url)
.header("Authorization", "Basic "+encode(user, pwd))
.header("x-api-version", "1")
.accept("Application/json")
.get(ClientResponse.class);
if (response.getStatus() != 200) {
}else{
restConnector.LOGGER.info("REST connection STARTED.");
}
String output = response.getEntity(String.class);
ObjectMapper mapper = new ObjectMapper();
mapper.setPropertyNamingStrategy(new MyNameStrategy());
try {
List<Alert> alert = mapper.readValue(output, new TypeReference<List<Alert>>(){});
} catch (JsonGenerationException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void close() {
}
}
但是,当我尝试在另一个类中提取数据时,它只给出了refreshData()方法内的system.out.print中的空值。这是应该打印数据的代码
public class Application{
Alert alerts = new Alert();
public Application() {
refreshData();
}
private void initComponents() {
restConnector.init();
refreshData();
}
private void refreshData() {
System.out.println("appalertList: "+alerts.getComponentAt(0));
}
}
这是我的警报课
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(Include.NON_EMPTY)
public class Alert {
private int pasID;
private String status;
private boolean shared;
private String header;
private String desc;
public int getPasID() {
return pasID;
}
public void setPasID(int pasID) {
this.pasID = pasID;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public boolean isShared() {
return shared;
}
public void setShared(boolean shared) {
this.shared = shared;
}
public String getHeader() {
return header;
}
public void setHeader(String header) {
this.header = header;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("\n***** Alert Details *****\n");
sb.append("PasID="+getPasID()+"\n");
sb.append("Status="+getStatus()+"\n");
sb.append("Shared="+isShared()+"\n");
sb.append("Header="+getHeader()+"\n");
sb.append("Description="+getDesc()+"\n");
sb.append("*****************************");
return sb.toString();
}
public String getComponentAt(int i) {
return toString();
}
}
我很沮丧,已经被困在这里已经有好几天了所以所有的帮助都会非常感激。感谢您的帮助。
编辑:稍微格式化代码并删除NullPointerException,因为它不再发生。
答案 0 :(得分:1)
如评论中所述:
我:在您的第一段代码中,您拥有此
try { List<Alert> alert..
,但您对新声明的提醒List<Alert>
完全没有任何帮助。这是数据应该来自哪里?OP:我的印象是,该位代码是将JSON数组推送到
Alert.class
的代码。那里有什么我想念的吗?我:是什么让你觉得它做到了?它只是读取json,
Alert.class
参数是类类型参数,因此映射器知道在创建Alert
对象时应将结果映射到Alert
属性。这就是做List<Alert>
的可能性,因为Alert.class
在T
中传递了List<T>
。List<Alert>
是从阅读中返回的内容,但您必须确定对列表实际执行的操作。目前,你完全不做任何事情
你可能想稍微改变一下课程。
现在这绝不是一个好的设计,只是一个如何让它工作的例子。我会花一些时间坐下来思考你希望如何充分利用restConnector
话虽如此,您可以在List<Alert> alerts;
班级中拥有restConnector
班级成员。并有一个吸气剂
public class restConnector {
private List<Alert> alerts;
public List<Alert> getAlerts() {
return alerts;
}
...
}
然后,当使用映射器进行反序列化时,将值分配给private List<Alert> alerts
。你正在做的是声明一个新的本地范围列表。而不是
try {
List<Alert> alert = mapper.readValue...
改为执行此操作
try {
alerts = mapper.readValue
现在为类成员分配了一个值。因此,在Application
课程中,您可以执行类似
public class Application {
List<Alert> alerts;
restConnector connect;
public Application() {
initComponents();
}
private void initComponents() {
connector = restConnector.getInstance();
connector.init();
alerts = connector.getAlerts();
refreshData();
}
private void refreshData() {
StringBuilder sb = new StringBuilder();
for (Alert alert : alerts) {
sb.append(alert.toString()).append("\n");
}
System.out.println("appalertList: "+ sb.toString());
}
}
现在您可以访问列表中的Alert
。
但请允许我重申:这是一个可怕的设计。例如,您将init
方法限制为单个调用,在该调用中,它只能获取一个且只能获得一个资源。如果其他服务需要访问其他资源怎么办?你已经完成了请求,所以你不能。
花一些时间考虑一些好的OOP设计,其中该类可以用于不同的场景。