Find the right job
for you
View jobs across a wide range of professions to take the next step in finding your dream career.
We cover hundreds of jobs in multiple sectors and industries across Canada. Search now to find your next career-defining role
All professions
The following has evaluated to null or missing: ==> haysJobsLocalService.getjobs(keyword, null, null,"3", ucmLocale) [in template "20115#20151#T-HAYS-JOBS-BY-KEYWORD-WEB2" at line 26, column 36] ---- Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: #assign jobsResults = haysJobsLocalSe... [in template "20115#20151#T-HAYS-JOBS-BY-KEYWORD-WEB2" at line 26, column 13] ----
1<div class="py-16">
2
3<#assign haysJobsLocalService = serviceLocator.findService("com.hays.jobs.service.HaysJobsService")>
4<#assign ucmLocaleKey = themeDisplay.getLocale()+"."+siteType+"."+"ucmLocale">
5<#assign mobileUrlKey = themeDisplay.getLocale()+"."+siteType+"."+"WEB2_Mobile_Hostname">
6<#assign jobURLKey = themeDisplay.getLocale()+"."+siteType+"."+"WEB2_JobSearch">
7<#assign jobSearchUrl = propsUtil.get(jobURLKey)!"">
8<#assign ucmLocale = propsUtil.get(ucmLocaleKey)!"">
9<#assign mobilePortalUrl = propsUtil.get(mobileUrlKey) !"">
10<#assign langId = themeDisplay.getLanguageId() />
11<#assign currency = staticUtil["java.util.Currency"]>
12<#assign textFormatter = staticUtil["java.net.URLEncoder"]>
13
14<#assign index = 3 />
15<#assign jobCardTitle = ""/>
16<#assign portalSearchURL = "" />
17<#assign jobFriendlyUrl = "" />
18<#assign jobCardSalaryDescription = ""/>
19<#assign jobCardLocationDescription = ""/>
20
21<#if JobsByKewords.getSiblings()?has_content>
22 <#list JobsByKewords.getSiblings() as cur_JobsByKeword>
23 <#assign keyword = cur_JobsByKeword.Keyword.getData()>
24 <#assign encodedKeyword = textFormatter.encode(keyword, "UTF-8")>
25 <#if keyword?? && keyword?has_content>
26 <#assign jobsResults = haysJobsLocalService.getjobs(keyword, null, null,"3", ucmLocale)>
27 <#assign portalSearchURL = mobilePortalUrl + "/" + jobSearchUrl + "?q=${encodedKeyword}" />
28
29 <#if !jobsResults.getJSONObject("result").isNull("jobs")>
30 <div>
31
32 <div class="d-flex justify-content-between align-items-end container-content flex-wrap mb-9">
33 <#if cur_JobsByKeword.Title.getData()?has_content>
34 <h2 class="text-brand-blue font-weight-light mb-0 fs-700 fs-lg-800 mb-0 section-heading">
35 ${cur_JobsByKeword.Title.getData()?keep_before(" ")}
36 <span class="font-weight-semibold">${cur_JobsByKeword.Title.getData()?keep_after(" ")}</span>
37 </h2>
38 </#if>
39 <#if cur_JobsByKeword.CTA.getData()?has_content>
40 <a class="button button--arrow button--no-style-teal-dark" href=${portalSearchURL}>${cur_JobsByKeword.CTA.getData()}</a>
41 </#if>
42 </div>
43
44 <#assign resultJobs = jobsResults.getJSONObject("result").getJSONArray("jobs")>
45 <#assign jobsResultsLength = resultJobs.length() />
46 <#assign index = (jobsResultsLength > 3)?then(3, jobsResultsLength) />
47
48 <div class="carousel">
49 <ul class="container-content grid grid-3 grid-gap-16 grid-gap-lg-32 grid-lg-3">
50 <#list 0..index-1 as i>
51 <#if jobsResultsLength != 0>
52 <#if resultJobs.getJSONObject(i).has("nonFilterableCustomFields")>
53 <#if resultJobs.getJSONObject(i).getJSONObject("nonFilterableCustomFields").has("JobTitle")>
54 <#assign jobCardTitle = resultJobs.getJSONObject(i).getJSONObject("nonFilterableCustomFields").getJSONObject("JobTitle").getJSONArray("values")?replace("\"", "")?replace("]", "")?replace("[", "")/>
55 <#assign jobCardTitle = jobCardTitle?replace("\\\\u(....)", "&#x$1;", "r")/>
56 </#if>
57 <#if resultJobs.getJSONObject(i).getJSONObject("nonFilterableCustomFields").has("xLocationDescription")>
58 <#assign jobCardLocationDescription = resultJobs.getJSONObject(i).getJSONObject("nonFilterableCustomFields").getJSONObject("xLocationDescription").getJSONArray("values")?replace("\"", "")?replace("]", "")?replace("[", "")/>
59 <#assign jobCardLocationDescription = jobCardLocationDescription?replace("\\\\u(....)", "&#x$1;", "r")/>
60 </#if>
61 <#if resultJobs.getJSONObject(i).getJSONObject("nonFilterableCustomFields").has("xSalaryDescription")>
62 <#assign jobCardSalaryDescription = resultJobs.getJSONObject(i).getJSONObject("nonFilterableCustomFields").getJSONObject("xSalaryDescription").getJSONArray("values")?replace("\"", "")?replace("]", "")?replace("[", "")/>
63 <#assign jobCardSalaryDescription = jobCardSalaryDescription?replace("\\\\u(....)", "&#x$1;", "r")/>
64 </#if>
65 <#if resultJobs.getJSONObject(i).getJSONObject("nonFilterableCustomFields").has("xLocaleRecordID")>
66 <#assign url = resultJobs.getJSONObject(i).getJSONObject("nonFilterableCustomFields").getJSONObject("xLocaleRecordID").getJSONArray("values")?replace("\"", "")?replace("]", "")?replace("[", "")/>
67 <#assign jobUrl = url?keep_after("//")?keep_after("/") />
68 <#assign jobFriendlyUrl = mobilePortalUrl + "/" + jobUrl + "?jobSource=HaysGCJ" />
69 </#if>
70 </#if>
71 </#if>
72
73 <li class="carousel-slide">
74 <a href="${jobFriendlyUrl}" class="job-card job-card--grid-teal is-active d-block rounded-lg border border-borders py-7 pb-lg-6 pt-lg-5 px-6 d-flex">
75 <h4 class="text-black lh-title fs-500 fs-lg-600 font-weight-bold mb-4">
76 ${jobCardTitle}
77 </h4>
78 <ul class="font-weight-light mb-4 mb-lg-4 fs-400 fs-lg-400">
79 <li class="d-flex mb-3">
80 <svg class="feather-icon mr-3 mr-lg-5">
81 <path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z"></path>
82 <circle cx="12" cy="10" r="3"></circle>
83 </svg>
84 <span class="job-card-label font-weight-normal">${jobCardLocationDescription}</span>
85 </li>
86 <li class="d-flex align-items-start">
87 <div class="group-center mr-3 mr-lg-5">
88 <svg class="feather-icon">
89 <circle cx="12" cy="12" r="10"></circle>
90 </svg>
91 <span>
92 <#if langId == "en_AE" || langId == "en_CZ" || langId == "en_PL">
93 <svg class="feather-icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" style="width:13px;height:13px">
94 <path d="M13 5C13 6.10457 10.5376 7 7.5 7C4.46243 7 2 6.10457 2 5M13 5C13 3.89543 10.5376 3 7.5 3C4.46243 3 2 3.89543 2 5M13 5V9.45715C11.7785 9.82398 11 10.3789 11 11M2 5V17C2 18.1046 4.46243 19 7.5 19C8.82963 19 10.0491 18.8284 11 18.5429V11M2 9C2 10.1046 4.46243 11 7.5 11C8.82963 11 10.0491 10.8284 11 10.5429M2 13C2 14.1046 4.46243 15 7.5 15C8.82963 15 10.0491 14.8284 11 14.5429M22 11C22 12.1046 19.5376 13 16.5 13C13.4624 13 11 12.1046 11 11M22 11C22 9.89543 19.5376 9 16.5 9C13.4624 9 11 9.89543 11 11M22 11V19C22 20.1046 19.5376 21 16.5 21C13.4624 21 11 20.1046 11 19V11M22 15C22 16.1046 19.5376 17 16.5 17C13.4624 17 11 16.1046 11 15" stroke="" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
95 </svg>
96 <#else>
97 ${currency.getInstance(themeDisplay.getLocale()).getSymbol(themeDisplay.getLocale())}
98 </#if>
99 </span>
100 </div>
101 <span class="job-card-label font-weight-normal">${jobCardSalaryDescription}</span>
102 </li>
103 </ul>
104
105 <div class="job-card__action">
106 <#if (JobDetailText.getData())??>
107 <button onClick="location.href='${jobFriendlyUrl}'" class="button button--small button--teal-dark button--arrow">
108 ${JobDetailText.getData()}
109 </button>
110 </#if>
111 </div>
112
113 </a>
114 </li>
115 </#list>
116 </ul>
117 </div>
118 </div>
119 <br/>
120 </#if>
121 </#if>
122 </#list>
123</#if>
124</div>
Search for your perfect role
Search hundreds of roles by keyword or location and apply for your dream job today.
We know that finding the right role at the right time takes careful consideration. We’re by your side, every step of the way.
Whether you’re looking for people to transform your organization or the services to empower a business transformation – we’ll achieve your goals together.