Если атрибут возвращает empty / null, то автоматически устанавливает его как значение «N / A» без условия if — then

#java #loops #null #ldap

#java #циклы #null #ldap

Вопрос:

Первоначально я напрямую устанавливал значение своего атрибута в модели getter setter, не проверяя, является ли атрибут пустым или нулевым.

 String urlLDAP = "ldap://localhost:389/";
NamingEnumeration results = null;
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, urlLDAP);
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, "cn=admin,ou=sa,o=system");         
env.put(Context.SECURITY_CREDENTIALS, "XXX");
DirContext context = new InitialDirContext(env);
SearchControls controls = new SearchControls();
controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
results = context.search(recipientDN, "(objectclass=person)", controls);
while (results.hasMore()) {
    SearchResult searchResult = (SearchResult) results.next();
    Attributes attribute = searchResult.getAttributes();
    try{
        Info info = new Info();
        for (user : userList){          

            info.setUserName(attribute.get("fullName").toString());
            info.setdivision(attribute.get("division").toString());
            info.setAttr3(attribute.get("attribute3").toString());
            .
            .
            .
            .
            info.setAttr3(attribute.get("attribute16").toString());


        }
    }catch (NullPointerException ex) {
        Logger.getLogger(robotb.class.getName()).log(Level.SEVERE, null, ex);
    }
}
  

Затем я добавляю условие if-else для каждого атрибута, потому что я понял, что не все пользователи содержат тот же атрибут, что и другие пользователи.
Например, у пользователя A нет атрибутов 4 и 5, но у пользователя B есть эти два атрибута.

 for (user : userList){

        if(attribute.get("fullName").toString() != null)
            info.setUserName(attribute.get("fullName").toString())
        else 
            info.setUserName("N/A");

        if(attribute.get("division").toString() != null)
            info.setdivision(attribute.get("division").toString())
        else 
            info.setdivision("N/A");

        if (attribute3 != null)
        .
        .
        .

        if (attribute4 != null)
        .
        .
        .
        .
        .

        if (attribute16 ! null)
        .
        .
        .

    }
  

Однако это приводит к тому, что мой код становится очень длинным.
Есть ли другие способы упростить это? Извините, что задал такой глупый вопрос
Ценит ваш совет

—РЕДАКТИРОВАТЬ

Я добавил условие if-else, чтобы избежать попадания в исключение, подобное этому

 Exception in thread "main" java.lang.NullPointerException
  

Когда я попадаю в такое исключение, цикл останавливается, и я не могу прочитать другие атрибуты

Комментарии:

1. Это также должно вызвать исключения NullPointerExceptions, поскольку вы не можете вызвать метод toString() для атрибута, который равен null.

2. используете ли вы java 8? если да, вы могли бы использовать Optional.OrElse() docs.oracle.com/javase/8/docs/api/java/util /…

3. Objects.toString(attribute.get("division"), "N/A") ???

4. @Отметьте True. Спасибо, что напомнили мне. Я буду их удалять

5. @AshFrench спасибо. Проверит это

Ответ №1:

Самый простой способ сделать это — создать метод для проверки значений.

 private String fixValue(Object input){
    return input != null ? input.toString() : "N/A";
}
  

Затем вы можете использовать его в своих установщиках:

 info.setUserName(fixValue(attribute.get("fullName")))
  

Если вы также хотите проверить пустые строки, вы можете перегрузить метод fixValue() этим вторым, чтобы он также проверял, является ли атрибут пустым, когда он является строкой:

 private String fixValue(String input){
    Object inputValue = input == null || input.isEmpty() ? null : input;
    return fixValue(inputValue);
}
  

Редактировать:

вы можете просто объявить один метод следующим образом:

 private String fixValue(Object input){      
    return input == null || input.toString().isEmpty() ? "N/A" : input.toString();
}
  

Ответ №2:

Использование может использовать? оператор JAVA, подобный этому:

 info.setdivision((attribute.get("division")==null)?"N/A":attribute.get("division").toString());
  

Для получения дополнительной информации читайте о? оператор:

http://www.cafeaulait.org/course/week2/43.html

Ответ №3:

Используя org.apache.commons.lang.StringUtils

 info.setUserName(StringUtils.defaultIfEmpty(attribute.get("fullName"), "N/A"));
  

Или вы могли бы создать частный метод, обрабатывающий его, чтобы еще больше сократить код