1

I added JAX-RS Web service for my project .I want to get XML file. It works fine when I hard cord something on return statement and it works fine. But I want to get data from my database. I use

 @Autowired
 private ProductServices productServices;

for call Spring Service class... For other normal controllers this @Autowired working fine. In JAX-RS it doesn't works. JAX-RS gives null value like this

I want to call this service for get data to my method. How can I do that..

This is my Model.

@Entity
@Table(name = "products")
@XmlRootElement
public class Product {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "product_id")
    private long productId;

    @NotNull
    private String serialNo;
    @NotNull
    private int slsiUnit;
    @NotNull
    private String itemDesc;
    @NotNull
    private int slsNo;
    @NotNull
    private String hsCode;

    @NotNull
    private String userIDandTime;

    @NotNull
    private String recentUpdateBy;

    public long getProductId() {
        return productId;
    }

    public void setProductId(long productId) {
        this.productId = productId;
    }

    public String getSerialNo() {
        return serialNo;
    }

    public void setSerialNo(String serialNo) {
        this.serialNo = serialNo;
    }

    public int getSlsiUnit() {
        return slsiUnit;
    }

    public void setSlsiUnit(int slsiUnit) {
        this.slsiUnit = slsiUnit;
    }

    public String getItemDesc() {
        return itemDesc;
    }

    public void setItemDesc(String itemDesc) {
        this.itemDesc = itemDesc;
    }

    public int getSlsNo() {
        return slsNo;
    }

    public void setSlsNo(int slsNo) {
        this.slsNo = slsNo;
    }

    public String getHsCode() {
        return hsCode;
    }

    public void setHsCode(String hsCode) {
        this.hsCode = hsCode;
    }

    public String getUserIDandTime() {
        return userIDandTime;
    }

    public void setUserIDandTime(String userIDandTime) {
        this.userIDandTime = userIDandTime;
    }

    public String getRecentUpdateBy() {
        return recentUpdateBy;
    }

    public void setRecentUpdateBy(String recentUpdateBy) {
        this.recentUpdateBy = recentUpdateBy;
    }
}

This is my Repository.

public interface ProductRepository extends CrudRepository<Product, Long> {

    @Override
    Product save(Product product);

    @Override
    Product findOne(Long productId);

    @Override
    List<Product> findAll();

    @Override
    void delete(Long productId);
}

This is my Services class

@Service
public class ProductServices {

    private static final Logger serviceLogger = LogManager.getLogger(ProductServices.class);

    @Autowired
    private ProductRepository productRepository;

    public List<Product> getProductList() {
        return productRepository.findAll();
    }

    public Product getProductById(long productId) {
        return productRepository.findOne(productId);
    }
}

This is my JAX-RS Web Service class

@Path("release")
public class GenericResource {

    @Context
    private UriInfo context;

    @Autowired
    private ProductServices productServices;

    public GenericResource() {
    }

    @GET
    @Produces(MediaType.APPLICATION_XML)
    public List<Product> getXml() {
        List<Product> a = productServices.getProductList();
        return a;
    }
}

This is the MessageBodyWriter

@Provider
@Produces(MediaType.APPLICATION_XML)
public class restConverter implements MessageBodyWriter<List<Product>> {

    @Override
    public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
        return Product.class.isAssignableFrom(type);
    }

    @Override
    public long getSize(List<Product> t, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
        return -1;
    }

    @Override
    public void writeTo(List<Product> t, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException {
        out.write(t.toString().getBytes());
    }

}

This is a extend class for JSX-RS

@ApplicationPath("TransferPermit/Slsi_Customs/restAPI")
public class restConfig extends Application{

}

This is my pom.xml

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-taglibs</artifactId>
        </dependency>

        <!--handle servlet-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
        </dependency>

        <!--<Email Dependency>-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
            <version>1.4.3.RELEASE</version>      
        </dependency>


        <!--Add mysql dependency-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>6.0.3</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
        </dependency>


        <!--jasper-->
        <dependency>
            <groupId>net.sf.jasperreports</groupId>
            <artifactId>jasperreports</artifactId>
            <version>3.7.6</version>
            <scope>compile</scope>
        </dependency>

        <dependency>
            <groupId>org.glassfish.jersey.bundles</groupId>
            <artifactId>jaxrs-ri</artifactId>
            <version>2.13</version>
        </dependency>

        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.1</version>
        </dependency>

        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.1</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>javax.mail-api</artifactId>
            <version>1.5.5</version>
            <type>jar</type>
        </dependency>
        <dependency>
            <groupId>javax.ws.rs</groupId>
            <artifactId>javax.ws.rs-api</artifactId>
            <version>2.0.1</version>
            <type>jar</type>
        </dependency>
    </dependencies>

Special : This cord works fine. But in Web service class productServices auto-wired dependency not working. What is the error :

@RequestMapping(value = "/ViewProduct", produces = {MediaType.APPLICATION_JSON_VALUE}, method = RequestMethod.GET)
        @JsonIgnore
        public ResponseEntity<List<Product>> listAllProducts() {
            List<Product> viewProducts = productServices.getProductList();
            if (viewProducts.isEmpty()) {
                return new ResponseEntity<List<Product>>(HttpStatus.NO_CONTENT);
            }
            System.out.println("entity " + new ResponseEntity<List<Product>>(HttpStatus.NO_CONTENT));
            return new ResponseEntity<List<Product>>(viewProducts, HttpStatus.OK);
    }

What is the error in my cord. How can I call data from database

Please help me someone for return XML...

vidarshana
  • 80
  • 3
  • 12
  • By any chance, is the class that is using @Autowired in a path/package that you have Spring scanning for annotations? – dbreaux Jan 31 '18 at 16:07
  • yes..@Autowired is in the scanning area... – vidarshana Jan 31 '18 at 16:33
  • Oh well, that was an easy possibility to check, that has bitten me before :-) It might be a disconnect between Spring-managed and Java EE server-managed context/beans. I wonder if you might be able to try @Inject instead. Sorry, I'm just stabbing at things... Hopefully somebody who *knows* will arrive – dbreaux Jan 31 '18 at 17:23
  • how can use @Inject for my project... Thanks for rour msg – vidarshana Jan 31 '18 at 17:53
  • @Inject is part of CDI, which your Java EE server (if you're using one) might support. – dbreaux Jan 31 '18 at 22:16
  • @dbreaux please check this https://stackoverflow.com/questions/23549322/spring-autowire-is-not-working-returning-null – vidarshana Feb 01 '18 at 00:14

0 Answers0