ZGDVeljo
ZGDVeljo

Reputation: 33

JAX-RS test web service showing a blank web page after adding a new @PATH annotation to a new method

I am implementing a restful service in java using JAX-RS, and when testing the service it works only for one of my methods, when I add a new method with a different @PATH annotation the test web page is just blank without errors

My resource class

@Path("beer") public class BeerResources {

@Context
private UriInfo context;

/**
 * Creates a new instance of BeerResources
 */
public BeerResources() {
}

@GET
@Path("/costliest")
@Produces(MediaType.TEXT_PLAIN)
public String getCostliest() {
    //TODO return proper representation object
    return new BusinessLayer().getCostliest();
}

@GET
@Path("/cheapest")
@Produces(MediaType.APPLICATION_XML)
public String getCheapest() {
    //TODO return proper representation object
    return new BusinessLayer().getCheapest();
}

}

Application config class

@javax.ws.rs.ApplicationPath("/webresources") public class ApplicationConfig extends Application {

@Override
public Set<Class<?>> getClasses() {
    Set<Class<?>> resources = new java.util.HashSet<>();
    addRestResourceClasses(resources);
    return resources;
}

/**
 * Do not modify addRestResourceClasses() method.
 * It is automatically populated with
 * all resources defined in the project.
 * If required, comment out calling this method in getClasses().
 */
private void addRestResourceClasses(Set<Class<?>> resources) {
    resources.add(beerrestful.BeerResources.class);
}

}

Upvotes: 0

Views: 739

Answers (2)

quintin
quintin

Reputation: 837

Make sure you are returning proper XML format

Example:

@Produces(MediaType.APPLICATION_XML)
public String getCheapest() {
    return "<abc>xyz</abc>";
}

If BusinessLayer().getCheapest() function is returning String and you have used tag @Produces(MediaType.APPLICATION_XML) it will just show you a blank page.

Use appropriate MediaType in @Produces tag according to the value returned from BusinessLayer().getCheapest() function

Upvotes: 0

ayurchuk
ayurchuk

Reputation: 1989

You can try to use Spring Boot + JAX-RS approach or Spring Boot + Spring MVC. Here are both of them on my Github page.

Also there is Spring Boot + JAX-RS source code:

Application.java:

@SpringBootApplication
public class Application extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }

    public static void main(String[] args) {
        SpringApplicationBuilder builder = new SpringApplicationBuilder(Application.class);
        new Application().configure(builder).run(args);
    }
}

DrinkEndpoint.java:

@Component
@Path("/drinks")
public class DrinkEndpoint {

    @Autowired
    private DrinkService drinkService;

    @GET
    @Path("/list")
    @Produces(MediaType.APPLICATION_JSON)
    public Iterable<Drink> getCostliest() {
        return drinkService.getDrinks();
    }

    @GET
    @Path("/{drink}")
    @Produces(MediaType.APPLICATION_JSON)
    public Response getCheapest(@PathParam("drink") String name) {
        Optional<Drink> drink = drinkService.getDrink(name);

        if (drink.isPresent()) {
            return Response.status(201).entity(drink.get().getName()).build();
        } else {
            return Response.status(201).entity("NOT_FOUND").build();
        }
    }
}

DrinkService.java:

public interface DrinkService {
    Iterable<Drink> getDrinks();
    Optional<Drink> getDrink(String name);
}

DrinkServiceImpl.java:

@Component
public class DrinkServiceImpl implements DrinkService {

    private List<Drink> drinks = new ArrayList<Drink>() {{
        add(new Drink("Coca Cola", 1886));
        add(new Drink("Pepsi", 1903));
    }};

    public Iterable<Drink> getDrinks() {
        return drinks;
    }

    public Optional<Drink> getDrink(String name) {
        for (Drink drink : drinks) {
            if (drink.getName().equalsIgnoreCase(name)) {
                return Optional.of(drink);
            }
        }
        return Optional.empty();
    }
}

ApplicationConfig.java:

@Component
public class ApplicationConfig extends ResourceConfig {

    public ApplicationConfig() {
        register(DrinkEndpoint.class);
    }
}

Drink.java:

public class Drink {
    private String name;
    private int since;

    public Drink(String name, int since) {
        this.name = name;
        this.since = since;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getSince() {
        return since;
    }

    public void setSince(int since) {
        this.since = since;
    }
}

pom.xml:

<project>
    ....
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>1.3.0.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jersey</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

To start application run:

mvn spring-boot:run

Then open in browser:

http://localhost:8080/drinks/list

http://localhost:8080/drinks/pepsi

Upvotes: 0

Related Questions