2016-01-29 1 views
0
<%@ page import="com.day.cq.wcm.mobile.api.device.*"%> 
<% 
Device device = slingRequest.adaptTo(Device.class); 

if(device != null) { 
     DeviceGroup deviceGroup = device.getDeviceGroup(); 

     String userAgent = device.getUserAgent(); 
     out.write(" Test\n"); 
    } 

%> 

переменная устройства всегда нуль. Этот вопрос задается на форуме Adobe, но об этом никто не ответил. Было бы полезно, если вы сможете поделиться своим опытом в решении этой проблемы.Строп адаптер для устройства обнаружения запроса страницы не работает (в CQ AEM 6.1)

Примечание: slingRequest уже определен в global.jsp

+1

Это что-то, что вы раньше делали в более ранних версиях и которое перестало работать в AEM 6.1 или что-то, чего вы еще не делали раньше? Это не похоже на то, что класс «Устройство» можно адаптировать из объекта запроса OOTB. По крайней мере, это не упоминается [в документах] (https://docs.adobe.com/docs/en/aem/6-1/develop/platform/sling-adapters.html). Рассматривая Javadoc для этого пакета, я вижу интерфейс 'DeviceMapper', который имеет метод с правильной подписью и может быть доступен как служба OSGi. Я не могу проверить это на данный момент, так как у меня нет экземпляра AEM. – toniedzwiedz

+0

Javadoc здесь: https://docs.adobe.com/docs/en/aem/6-1/ref/javadoc/com/day/cq/wcm/mobile/api/device/package-summary.html – toniedzwiedz

+0

Спасибо toniedzwiedz для ответа. Я попробую ваше предложение. Ценю вашу помощь. – zadd

ответ

4

Я работаю на одно и то же прямо сейчас. Вы не можете получить устройство напрямую из запроса, сначала получите DeviceGroup, откуда вы получите все, что захотите.

final DeviceGroup deviceGroup =slingRequest.adaptTo(DeviceGroup.class); if(deviceGroup!=null)deviceGroup.drawHead(pageContext);

+0

Спасибо Шивани за ответ. Не могли бы вы также отправить код из набора объекта устройства из DeviceGroup? – zadd

+0

zadd, adobe document говорит, что вы можете получить устройство так, как вы это делали. Но это не работает. Можете ли вы объяснить свой usecase, чтобы я мог узнать, как это сделать. Короче, зачем вам нужен объект устройства. –

0

Просто попробовал это на моем случае и:

Device device = request.adaptTo(Device.class); 

возвращается null, в то время как:

DeviceGroup deviceGroup = request.adaptTo(DeviceGroup.class); 

с другой стороны, получает мне ссылку на правильный DeviceGroup объект ,

Если вам нужно устройство, а не группа, попробуйте использовать DeviceMapper. Оказывается, что DeviceMapper действительно доступен как сервис, реализуемый com.day.cq.wcm.mobile.core.impl.devicemapper.DeviceMapperImpl

Поэтому в вас JSP, вы можете просто написать:

<%@ page import="com.day.cq.wcm.mobile.api.device.DeviceMapper" %> 

... 

<% 
    DeviceMapper deviceMapper = sling.getService(DeviceMapper.class); 
    Device device = deviceMapper.getDeviceInstance(slingRequest); 
%> 

И это должно дать вам правильный объект при условии, что все соответствующие конфигурации правильные.

Однако, если возможно, вы должны стараться избегать размещения такой логики в своем JSP. Этот тип кода должен быть инкапсулирован на фабрике адаптера или предпочтительно в модели Sling. Таким образом, вы сможете избавиться от всего кода от уровня представления и просто прочитать простые свойства в JSP.

Вы также можете взглянуть на com.day.cq.wcm.mobile.core.MobileUtil.class, который может соответствовать вашему конкретному варианту использования.

Я также хотел бы отметить, что запись кода на целевом компьютере для конкретного устройства (в отличие от группы) кажется немного странной. Прежде чем вводить кучу классов для обнаружения устройства, подумайте, можно ли добиться того же результата с помощью соответствующего стиля, версии мобильного сайта Target (если целью является предоставление различного контента пользователям с разными устройствами). Или, может быть, вам стоит просто пойти за AEM Apps

Смежные вопросы