【问题标题】:How to get osgi configuration values to a servlet如何将 osgi 配置值获取到 servlet
【发布时间】:2022-10-24 16:19:34
【问题描述】:

这是我的 OSGI 配置文件,它有三个名称。我想在 servlet 中读取这些值并按字母顺序对它们进行排序,然后将该响应发送到 ajax 以显示在自定义组件 AEM 中。

package com.demo.training.core.services.impl;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.metatype.annotations.AttributeDefinition;
import org.osgi.service.metatype.annotations.AttributeType;
import org.osgi.service.metatype.annotations.Designate;
import org.osgi.service.metatype.annotations.ObjectClassDefinition;
import com.demo.training.core.services.MyProjectServ;

@Component(service=MyProjectServ.class,immediate = true)
@Designate(ocd= MyProject.ServiceConfig.class)

public class MyProject implements MyProjectServ {
    
    @ObjectClassDefinition(name="My-Project OSGI",
            description="Demo OSGI configuration")
        
    public @interface ServiceConfig {

@AttributeDefinition(
    name="Name1",
    description="Add First name",
    type = AttributeType.STRING
    )
public String Name1() default "Abhinay";

@AttributeDefinition(
        name="Name2",
        description="Add second name ",
        type = AttributeType.STRING
        )
public String Name2() default "Pavan";

@AttributeDefinition(
        name="Name3",
        description="Add third name ",
        type = AttributeType.STRING     )
public String Name3() default "Ram";
    }
    private String Name1;
    private String Name2;
    private String Name3; 

@Activate
protected void activate(ServiceConfig myconfig) {
    Name1=myconfig.Name1();
    Name2=myconfig.Name2();
    Name3=myconfig.Name3();
}
@Override
public String getNAME1() {
    return Name1; }
@Override
public String getNAME2() {
    return Name2; }
@Override
public String getNAME3() {
    return Name3;
} }

'''这是我的 Servlet 代码,我写了多个 resp.getwriter() 来查看它在哪一行工作。它正在处理名为 a1 的响应(即在字典命令下方)。任何人都可以帮助从 osgi 配置中获取值到这个 servlet 吗?

package com.demo.training.core.servlets;

import java.io.IOException;
import java.util.Arrays;
import java.util.Dictionary;

import javax.servlet.Servlet;
import javax.servlet.ServletException;

import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.servlets.HttpConstants;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.osgi.framework.Constants;
import org.osgi.service.cm.Configuration;
import org.osgi.service.cm.ConfigurationAdmin;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;

@Component(service=Servlet.class,
property={
        Constants.SERVICE_DESCRIPTION + "=Practice Servlet",
        "sling.servlet.methods=" + HttpConstants.METHOD_GET,
        "sling.servlet.methods=" + HttpConstants.METHOD_POST,
        "sling.servlet.paths=/bin/myproject",
        "sling.servlet.extensions=" + "txt"
})
public class MyProjectServlet extends SlingAllMethodsServlet {/**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Reference
    private ConfigurationAdmin MYPROJECT_CONFIG;
    
    private static final String MY_PROJECT="com.demo.training.core.services.impl.MyProject";
    @Override
    protected void doGet(final SlingHttpServletRequest req,
            final SlingHttpServletResponse resp) throws ServletException, IOException {
        
        Configuration My_Servlet=MYPROJECT_CONFIG.getConfiguration(MY_PROJECT);
        Dictionary<String,Object> property =My_Servlet.getProperties();
        resp.getWriter().write("a1");
        String first=property.get("Name1").toString();
        String second=property.get("Name2").toString();
        String third=property.get("Name3").toString();
        resp.getWriter().write("a2");
        resp.getWriter().write(first);
        resp.getWriter().write("a3");
        String[] myArray = new String[]{first,second,third};
        
        Arrays.sort(myArray);

    String js=myArray.toString();
    resp.getWriter().write(js);
        }   
}


【问题讨论】:

    标签: ajax servlets service osgi aem


    【解决方案1】:

    您尝试为您的服务使用 @reference 注释。如果此对象为空,您可以使用ResourceResolverFactoy。这个对象总是存在的,否则你的实例有一个严重的问题:

    Map<String, Object> serviceParameter = new HashMap<>();
    serviceParameter.put(ResourceResolverFactory.SUBSERVICE, Put the name name of your service here);
    
    return resolverFactory.getServiceResourceResolver(serviceParameter);
    

    在 Servlet 中使用注解 @reference 注入 ResourceResolverFactoy:

      @Reference
      private ResourceResolverFactory ...;
    

    顺便说一下,注意 Java 代码约定。即使在服务配置中,方法名称也总是以小写字母开头。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-03
      • 1970-01-01
      • 1970-01-01
      • 2014-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多